2014-04-24 84 views
-2

想創建簡單的while循環,直到我的變量將是0 所以我創建了一個在循環顯示0

do 
{ 
x = x + 0.001; 
cout << x0 << endl; 
} while (SOME_CALCULATION != 0); 

一切都很正常,直到我來到循環0,那麼我得到7.63278e-017,而不是0

環例如:

result: -0.003 
result: -0.002 
result: -0.001 
result: 7.63278e-017 
result: 0.001 
result: 0.002 
result: 0.003 
+15

這是浮點運算的正常和預期行爲。 – gnasher729

+1

相關:[最有效的方法爲浮點數和雙重比較](http://stackoverflow.com/questions/17333/most-effective-way-for-float-and-double-comparison) –

+1

我們可以假設使用兩個變量('x'和'x0'),以及上面片段中'cout'行和報告結果之間的差異只是拼寫錯誤? –

回答

1

一些實數不能被精確地在浮點表示(例如,1.0/3.0)。結果,舍入誤差被引入,並且可以以令人驚訝的方式積累。檢查出this link欲知更多信息。

根據您的算法,一個簡單的解決方法可能是檢查<=0而不是==0。一般來說,如果您發現自己檢查了浮點值的等價性,則應該三思而行,並確保使用指定的類型可以精確地表示所有可能的值。

3

做這樣的事情:

double epsilon = 0.00001; 
    do 
    { 
     x = x + 0.001; 
     cout << x0 << endl; 
    } while (abs(SOME_CALCULATION) > epsilon); 
2

你可能要考慮重寫這個作爲

x = -3; 

do 
    { 
    x = x + 1; 
    cout << x0/1000 << endl; 
    } while (SOME_CALCULATION != 0); 

SOME_CALCULATION將需要調整的事實,x現在是一個整數,而不是分數浮點值 - 可能在計算中複製x0/1000將起作用。

分享和享受。

0

解決方法:使用長或者int變量,並轉換輸出之前增加一倍:

#include <iostream> 

using namespace std; 

main() 
{ 
    int x=-3; 
    do 
    { 
     x = x + 1; 
     cout << ((double)x)/1000 << endl; 
    } while (x < 4); 
} 

輸出:

-0.002 
-0.001 
0 
0.001 
0.002 
0.003 
0.004