printf()是否修改了它的参数?

时间:2015-09-24 20:14:32

标签: 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);

以上代码段工作正常。它打印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以某种方式修改了它的参数并以某种方式将它们四舍五入。

有人可以对此有所了解吗?

2 个答案:

答案 0 :(得分:6)

某些处理器(如x86)具有浮点寄存器,其精度高于数据类型(80位,而双位则为64位)。调用printf()会使这些寄存器存储在堆栈中,其中只为该变量分配了64位。这会导致您观察到的差异。

有关详细信息,请参阅What every computer scientist should know about floating-point arithmetic.

答案 1 :(得分:0)

printf()不会修改其参数。

我无法想象为错误寻求帮助而不是说明你得到了什么错误。你的意思是它断言。你确定两者都没有断言,但你只看到printf()之前由于某种原因断言的那个?