在我的程序中,我有一个像
这样的计算a = a * b * c;
d = f * b* c; // here f and a are same value
d = d - a;
当我打印d的值时,我得到了以下结果:
-1.95399e-14
所以我设置精度并使用cout中的fixed修改变量。
结果是:
-0.00000000000001954
我希望在表达式d = d - a;
所以我改变了我的代码,
cout<< d << endl;
cout<< a << endl;
当我包含上述两行时,变量&#39; d&#39;在那个表达完全&#39; 0&#39;
之后如果我没有打印变量的值&#39; d&#39;并且&#39; a&#39;,它将结果显示为-1.95399e-14;
在这两种情况下,我希望结果为&#39; 0&#39;。我怎样才能做到这一点?这个cout声明在做什么?
答案 0 :(得分:1)
由于浮点数通常无法准确存储,因此计算结果中包含的误差非常小。当与优化器结合使用时,您可以得到一些令人费解的结果,您的情况就是一个。
在第一种情况下,编译器将a
和d
的结果保存在FPU寄存器中,其中(在x86上,在32位代码中)具有比double更高的精度。然后减去这些长的双倍值,给你一点点差异。当您添加cout调用时,a
和d
值将写入内存(两者都舍入到相同的数字),然后读回FPU寄存器进行减法,这样就可以了零。