繁体   English   中英

printf() 是否修改其参数?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM