2015-12-12 33 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寄存器進行減法,這會給你零。