小数当减去两个数字时

时间:2015-12-12 06:09:12

标签: c++

在我的程序中,我有一个像

这样的计算
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;

之前打印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声明在做什么?

1 个答案:

答案 0 :(得分:1)

由于浮点数通常无法准确存储,因此计算结果中包含的误差非常小。当与优化器结合使用时,您可以得到一些令人费解的结果,您的情况就是一个。

在第一种情况下,编译器将ad的结果保存在FPU寄存器中,其中(在x86上,在32位代码中)具有比double更高的精度。然后减去这些长的双倍值,给你一点点差异。当您添加cout调用时,ad值将写入内存(两者都舍入到相同的数字),然后读回FPU寄存器进行减法,这样就可以了零。