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以某种方式修改了它的参数并以某种方式将它们四舍五入.
有人可以对此有所了解吗?
某些处理器(如x86)具有浮点寄存器,其精度高于数据类型(80位,而双位则为64位).调用printf()会使这些寄存器存储在堆栈中,其中只为该变量分配了64位.这会导致您观察到的差异.
有关更多信息,请参阅每位计算机科学家应该了解的浮点运算.