2015-12-12 37 views
0

在我的计划,我有一个像小数当减去两个数字

a = a * b * c; 

d = f * b* c; // here f and a are same value 

d = d - a; 

计算当我打印d的值,我得到了以下结果:

-1.95399e-14

所以我设置精度,并通过使用固定在cout中打印变量。

结果是:

-0.00000000000001954

我要打印的d的值和,表达d = d - a;

所以我改变了我的代码,

cout<< d << endl; 

cout<< a << endl; 

当我包括上述t WO线,即表达后变量“d”的结果是完全“0”

如果我不打印变量“d”和“a”的值,它给出结果作为-1.95399e-14;

在这两种情况下,我都希望结果是'0'。我怎样才能做到这一点?这个cout陈述在做什么?

+0

浮点不准确。就这么简单。 http://floating-point-gui.de/ – PaulMcKenzie

+0

提供您使用的代码。正如之前评论的那样:阅读浮点数,因为关于某些方面(特别是精度和浮点算法),计算机算术与数学算术不同。 – Elyasin

回答

1

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

在第一种情况下,编译器将ad的结果保留在FPU寄存器中,其中(在x86上,32位代码中)的精度高于双精度值。这些长双数值然后被减去,给你一个细微的差别。当你添加cout调用时,ad值被写出到内存中(都舍入到相同的数字),然后回读到FPU寄存器进行减法,这会给你零。