2016-10-11 5 views
2

ステップサイズとして0.1を入力したとき、私のコードは出力としてx値だけ2.4になるのはなぜですか? .01または.001のような値を入力すると、2.5になります。C++オイラー近似

#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にプリントアウトし、あなたはこれを取得する:あなたの最後の過去に、あなたはそのため過去 2.5をインクリメントする方法

1.1000000000000001 
1.2000000000000002 
... 
2.4000000000000012 
2.5000000000000013 

注意をしますありません最後のループを実行します。浮動小数点数は10進数ではなく2進数(基数10)なので、すべての数値を正確に表すことができないからです。これには0.1が含まれます。

浮動小数点数を比較する際は、必ずイプシロンを使用する必要があります。

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

詳細は、read thisについて。 here is a live example.

+0

*浮動小数点数は10進数ではなく2進数(基数2)であるため、すべての数値を正確に表すためです。これは任意の整数の基数(有限の数の桁数が与えられた場合)に適用されます。 –

+0

私は、浮動小数点ループカウンタでは何もループしないことをお勧めします。フックまたは詐欺によって、それらのループ制約値を整数にする。 – PaulMcKenzie