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

Aks*_*mle -1 c++ precision printf 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);
Run Code Online (Sandbox Code Playgroud)

上面的代码片段工作正常.它打印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);
Run Code Online (Sandbox Code Playgroud)

上面两个片段中唯一的变化是assert和printf语句的顺序.这让我觉得printf以某种方式修改了它的参数并以某种方式将它们四舍五入.

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

Jos*_*ine 6

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

有关更多信息,请参阅每位计算机科学家应该了解的浮点运算.