2016-10-11 52 views
2

爲什麼當我輸入0.1作爲步長時,我的代碼只能達到2.4的x值作爲輸出?如果我輸入一個像.01或.001這樣的值,它會上升到2.5。C++ Euler Approximation

#include <iostream> 
#include <iomanip> 
using namespace std; 
int main() { 
    double step; 
    double x0 = 1.0; 
    double y0 = 1.0; 
    double diffY; 
    std::cout << std::fixed; 
    std::cout << std::setprecision(2); 
    cout << "Enter step value: "; 
    cin >> step; 
    while (x0 <= 2.5) { 

     diffY = x0 + ((3*y0)/x0); 
     cout << x0 << " " << y0 << "\n"; 
     x0+=step; 
     y0+=step*(diffY); 
    } 

    return 0; //initially defined the main function to return an int 
} 

謝謝!

+0

你應該循環使用基於整數的限制,並在循環內,向下縮放值。否則你的循環可能會根據編譯器,編譯器選項等而運行不同的次數。 – PaulMcKenzie

回答

0

好老時尚浮點數錯誤,打印出來的高精度你x0,你會得到這樣的:

1.1000000000000001 
1.2000000000000002 
... 
2.4000000000000012 
2.5000000000000013 

說明如何對你最後的過去,你會增加過去因此2.5將不執行你最後的循環。這是因爲浮點數是二進制(基2)而不是十進制(基數爲10),因此它們不能準確地表示每個數字。這包括0.1

比較浮點數時,應始終使用的埃普西隆:

float eps = step/100; // Only an example. 
while (x0 <= 2.5 + eps) { 
    ... 

欲瞭解更多信息,read this。如果你想玩,here is a live example.

+0

*「這是因爲浮點數是二進制(基2)而不是十進制(基數爲10),所以它們不能準確地表示每個數字。」*這適用於任何整數基數(給定有限數字)。 –

+0

我建議不要用浮點循環計數器循環。通過鉤子或騙子,得到那些循環約束值是整數。 – PaulMcKenzie