我试图了解不同语言如何处理浮点数。我知道浮点表示有一些固有的问题,这就是为什么如果你在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以某种方式修改了它的参数并以某种方式将它们四舍五入。
有人可以对此有所了解吗?
答案 0 :(得分:6)
某些处理器(如x86)具有浮点寄存器,其精度高于数据类型(80位,而双位则为64位)。调用printf()会使这些寄存器存储在堆栈中,其中只为该变量分配了64位。这会导致您观察到的差异。
有关详细信息,请参阅What every computer scientist should know about floating-point arithmetic.
答案 1 :(得分:0)
printf()
不会修改其参数。
我无法想象为错误寻求帮助而不是说明你得到了什么错误。你的意思是它断言。你确定两者都没有断言,但你只看到printf()
之前由于某种原因断言的那个?