[英]Does printf() modify its parameters?
我试图了解不同的语言如何处理浮点数。 我知道浮点表示存在一些固有的问题,这就是为什么如果你在 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);
上面的代码片段工作正常。 它打印 1.0。 但是,由于断言失败,以下代码段给出了运行时错误:
double x = 0.1,
sum = 0;
for(int i=0; i<10; ++i)
sum += x;
assert(sum == 1.0);
printf("%.9lf\n",sum);
上面两个片段中唯一的变化是 assert 和 printf 语句的顺序。 这让我认为 printf 正在以某种方式修改其参数并以某种方式将它们四舍五入。
有人可以对此有所了解吗?
某些处理器,例如 x86,具有比数据类型精度更高的浮点寄存器(80 位,而双精度则为 64 位)。 调用 printf() 会使这些寄存器存储在堆栈中,其中只有 64 位分配给变量。 这会导致您观察到的差异。
有关更多信息,请参阅 每个计算机科学家应该了解的有关浮点运算的知识。
printf()
不修改其参数。
我无法想象向错误寻求帮助而不是说明您遇到了什么错误。 你的意思是它断言。 您确定两者都没有断言,但出于某种原因,您只能看到在printf()
之前断言的那个吗?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.