Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/162.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ printf()是否修改其参数?_C++_Printf_Precision_Assert_Floating Accuracy - Fatal编程技术网

C++ printf()是否修改其参数?

C++ printf()是否修改其参数?,c++,printf,precision,assert,floating-accuracy,C++,Printf,Precision,Assert,Floating Accuracy,我想看看不同的语言是如何处理浮点数的。我知道浮点表示中存在一些固有的问题,这就是为什么如果在Python中使用0.3+0.6,那么得到的是0.899999,而不是0.9 然而,这些代码片段让我大吃一惊: double x = 0.1, sum = 0; for(int i=0; i<10; ++i) sum += x; printf("%.9lf\n",sum); assert(sum == 1.0); double x=0.1, 总和=0; 对

我想看看不同的语言是如何处理浮点数的。我知道浮点表示中存在一些固有的问题,这就是为什么如果在Python中使用0.3+0.6,那么得到的是0.899999,而不是0.9

然而,这些代码片段让我大吃一惊:

double x = 0.1,
    sum = 0;

for(int i=0; i<10; ++i) 
    sum += x;

printf("%.9lf\n",sum);
assert(sum == 1.0);
double x=0.1,
总和=0;

对于(int i=0;i某些处理器,如x86,其浮点寄存器的精度高于数据类型(80位,而双精度浮点寄存器的精度为64位)。调用printf()会将这些寄存器存储在堆栈上,其中仅为变量分配了64位。这会导致您观察到的差异

有关详细信息,请参见

printf()
不修改其参数


我无法想象在请求错误帮助时没有说明您遇到的错误。您的意思是它断言了什么。您确定两者都没有断言,但您只看到在
printf()之前断言的错误吗
出于某种原因?

尝试使用16位数字而不是9位数字。在遇到错误时,请不要不厌其烦地向他人寻求帮助。这太疯狂了。这似乎是另一个不理解浮点数工作原理的例子。再加上对printf的误解,你就有麻烦了。
printf
是一个C函数。C函数通过值而不是引用接收其参数,因此它们不能修改它们(数组除外,数组在传递给函数时转换为指针)。我不确定我是否理解您的问题。第一个代码段没有给我运行时错误,但第二个代码段有。我不明白为什么会这样。调用print()如何使这些寄存器存储在堆栈上?它们在堆栈上传递到
printf()
,但是在不调用printf()(或任何其他函数)的情况下,如何更改原始变量
sum
变量可能存储在寄存器中。如果是函数调用,则必须将变量保存在堆栈上,因为编译器无法保证被调用的函数不会将这些寄存器用于其他用途。我明白你的意思。如果这就是导致这种情况的原因,那就很有趣了。
double x = 0.1,
    sum = 0;

for(int i=0; i<10; ++i) 
    sum += x;

assert(sum == 1.0);
printf("%.9lf\n",sum);