我必须格式化std::string用sprintf,并将其发送到文件流.我怎样才能做到这一点?
是否有printf宽度说明符可以应用于浮点说明符,该说明符会自动将输出格式化为必要的有效位数,以便在重新扫描字符串时,获取原始浮点值?
例如,假设我打印float到2小数位数的精度:
float foobar = 0.9375;
printf("%.2f", foobar); // prints out 0.94
Run Code Online (Sandbox Code Playgroud)
当我扫描输出时0.94,我没有符合标准的保证我将获得原始的0.9375浮点值(在这个例子中,我可能不会).
我想要一种方法告诉printf自动将浮点值打印到必要的有效位数,以确保它可以扫描回传递给的原始值printf.
我可以使用一些宏float.h来导出要传递的最大宽度printf,但是是否已经有一个说明符可以自动打印到必要的有效位数 - 或者至少是最大宽度?
可能重复:
如何使用cout以完全精度打印double值?
float a = 175.;
cout << a;
Run Code Online (Sandbox Code Playgroud)
如果我运行前面的代码我将只得到175,我怎么能用(例如)3个小数位来输出数字,即使它们是零...我怎么能打印"175.000"?
我希望在比较期间控制double的精度,然后使用C++返回默认精度.
我打算用来setPrecision()设定精度.那么将精度设置回默认值的语法是什么(如果有的话)?
我正在做这样的事情
std::setPrecision(math.log10(m_FTOL));
Run Code Online (Sandbox Code Playgroud)
我做了一些事情,之后我想回到默认的双重比较.
我这样修改了,我还有一些错误
std::streamsize prec = std::ios_base::precision();
std::setprecision(cmath::log10(m_FTOL));
Run Code Online (Sandbox Code Playgroud)
cmath编译时为false,编译时为std::ios_basefalse.你能帮忙吗?
谢谢.
所以我正在学习C++.我已经获得了"C++编程语言"和"有效的C++",而且我正在运行Project Euler.问题1 ... dunzo.问题2 ......没那么多.我在VS328上使用Win32控制台应用程序.
什么是斐波纳契数列的所有偶数项的总和低于400万?
它没有工作,所以我减少到100的测试用例......
这是我写的......
// Problem2.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
cout << "Project Euler Problem 2:\n\n";
cout << "Each new term in the Fibonacci sequence is generated by adding the previous two terms. By starting with 1 and 2, the first 10 terms will be:\n\n";
cout << "1, 2, 3, 5, 8, 13, 21, 34, 55, 89, ...\n\n";
cout …Run Code Online (Sandbox Code Playgroud) 在数学上,考虑这个问题的有理数
8725724278030350 / 2**48
Run Code Online (Sandbox Code Playgroud)
其中**在分母表示取幂,即,分母是2对48次方.(分数不在最低方面,通过2可还原的)此数目是恰好作为表示的System.Double.它的十进制扩展是
31.0000000000000'49'73799150320701301097869873046875 (exact)
Run Code Online (Sandbox Code Playgroud)
撇号不代表缺失的数字,而只是标记圆形到15的分数.将执行17位数字.
请注意以下内容:如果此数字四舍五入为15位,则结果为31(后跟十三0秒),因为下一个数字(49...)以a开头4(意味着向下舍入).但如果数字首先四舍五入为17位,然后四舍五入为15位,结果可能是31.0000000000001.这是因为第一次舍入通过将49...数字增加到50 (terminates)(下一个数字73...)而向上舍入,然后第二次舍入可能再次向上舍入(当中点舍入规则表示"从零开始舍入"时).
(当然,还有更多具有上述特征的数字.)
现在,事实证明.NET的这个数字的标准字符串表示是"31.0000000000001".问题:这不是一个错误吗?通过标准字符串表示,我们指的String是由参数Double.ToString()实例方法产生的,当然,该方法与生成的方法相同ToString("G").
需要注意的一个有趣的事情是,如果你投的上述号码System.Decimal,然后你得到一个decimal是31准确!请参阅此Stack Overflow问题,以讨论将a转换Double为Decimal包含第一个舍入到15位的令人惊讶的事实.这意味着转换为Decimal正确的舍入到15位数,而调用ToSting()是不正确的.
总而言之,我们有一个浮点数,当输出给用户时,是31.0000000000001,但当转换为Decimal …
我有一个简单的C++程序,我认为会打印出f和g中定义的double值作为double ...但是C++将它们打印为整数.我检查了cout的默认精度,当我运行它时,输出显示默认精度应为6,所以我很困惑为什么双打不正确.
#include <iostream>
#include <stdio.h>
int main() {
double f = 735416.416898;
double g = f + 0.3;
std::cout << "default precision is " << std::cout.precision() << std::endl;
std::cout << "[c++] f = " << f << std::endl;
std::cout << "[c++] g = " << g << std::endl;
printf("[c] f = %f\n", f);
printf("[c] g = %f\n", g);
f = 735416.516898;
g = f + 0.3;
std::cout << "[c++] f = " << f << std::endl;
std::cout << "[c++] …Run Code Online (Sandbox Code Playgroud) 我想输出一个双精度值的全精度.但是,使用cout功能时,即使精度约为15-16位,它也只显示前6位数字.
如何让我的程序显示整个值,包括幅度(功率)组件?
最近我写了一段代码:
const int sections = 10;
for(int t= 0; t < 5; t++){
int i = pow(sections, 5- t -1);
cout << i << endl;
}
Run Code Online (Sandbox Code Playgroud)
结果是错误的:
9999
1000
99
10
1
Run Code Online (Sandbox Code Playgroud)
如果我只使用这个代码:
for(int t = 0; t < 5; t++){
cout << pow(sections,5-t-1) << endl;
}
Run Code Online (Sandbox Code Playgroud)
问题不再发生:
10000
1000
100
10
1
Run Code Online (Sandbox Code Playgroud)
有没有人给我解释?非常感谢你!
我试图在Rcpp函数的双精度输出中打印更多数字,但无法弄清楚如何...我看过如何使用cout以完全精度打印双值?通用C++答案的其他地方,但我看不出怎么做Rcpp,除了使用printf,我认为是最后的手段......
require(inline)
code <- '
double x=1.0;
std::cout.precision(10); // compiles but does nothing
Rcpp::Rcout.precision(10); // compiles but does nothing
printf("(1) %1.10lf\\n",x); // works but bad practice
Rcpp::Rcout << "(2) " << x << std::endl;
Rcpp::Rcout << "(3) " << std::setprecision(10) << x << std::endl;
return Rcpp::wrap(0);
'
fun <- rcpp(sig=c(v=0),body=code,includes="#include <iomanip>")
fun(1)
## (1) 1.0000000000
## (2) 1
## (3) 1
## [1] 0
Run Code Online (Sandbox Code Playgroud)