2017-02-15 109 views
0

我正在嘗試獲取帳篷方程的固定點。在給定的初始條件下,解決方案必須爲0.6。當我將float用於x0時,一切正常,但是當我將x0定義爲double時,解決方案在第55次迭代中變爲0.59999,這會在下一次迭代中導致進一步的變化,等等。爲什麼選擇數據類型時有這樣的差異?導致錯誤的雙數據類型

using namespace std; 
#include <iostream> 
main() 

{ 
    double x0=.6; 
    for (int i=0;i<100;i++) 
    { 
     if(x0<.5) 
      x0=1.5*x0; 
     else 
      x0=1.5*(1-x0); 

     cout << i << "\t" << x0 << endl; 

    } 

} 

我已經發布了結果圖片。 Comparison of solutions - Float and Double

+1

你被四捨五入的欺騙。添加'cout << setprecision(100)'將打印所有的數字。並訪問該問題[浮點數學是否被破壞?](http://stackoverflow.com/questions/588004/is-floating-point-math-broken)。 – molbdnilo

+1

如果可能,最好將文本結果添加爲文本。您附加的圖像可以用您問題中的代碼塊文字編寫。 –

回答

2

55次迭代的真正價值是0.5999994832150543633275674437754787504673004150390625當使用double0.60000002384185791015625用於float(我的系統上)。

兩者之間的差異在於數字有多精確並且舍入是什麼使您拋棄。

順便說一句,無論是兩個值是絕對準確,他們只是足夠接近近似,僅此而已。 double「更精確」。


UPDATE

幾點意見來回後,事實證明,沒有必要進行浮點運算是杜松子酒。整數(稍微修改)做得很好不會引入任何舍入。

+0

謝謝。我正試圖模擬動盪的系統,在這個系統中發生混亂。方程對初始條件非常敏感。輕微的變化會導致未來迭代的巨大變化。有沒有解決這個問題的方法? – Arjun

+0

你的問題真的取決於「這個問題」的**精確**定義。 「float」與「double」有什麼不同?還是說「double」的精確度不足以滿足您的需求?或者說,二進制數不是表示小數部分的好選擇的問題? – YePhIcK

+0

我擔心的是解決方案在某個迭代中偏離了它的確切值(在這種情況下爲0.6),導致下一次迭代返回錯誤的解決方案。有沒有辦法在所有迭代中獲得精確值(0.6)? – Arjun

相關問題