2016-08-23 24 views
0

パラメータで使用するとwhileループの条件に「適合」しないfmod()に問題があります。下のスニペットを再作成しました。これは私のメインプログラムと同じエラーを引き起こします。Fmod While Whileループ条件エラー

#include <math.h> 
int main() 
{ 
    double foo = 223.76; 
    double bar = foo; 
    while(fmod(bar,1.00) != 0) 
    { 
     bar += foo; 
    } 
    cout << bar << endl; 
} 

上記のコードは、最終的に5594を停止して印刷する必要がありますが、代わりに数百万個に達します。各ステップでbarの値を印刷すると、実際には5594の値に達していることがわかります(テストする場合は約25ステップかかります)。なぜそれが停止しないのかわかりません。

+3

不正確な値と、正確な数との比較を繰り返すと、浮動小数点プログラミングのCardinal Sinsが繰り返されます。これは決してそのまま動作しません。すべてを100倍して簡単に解決してください。 –

+0

'223.76'は、2のべき乗の倍数であれば、(通常のC++実装で)正確に表現することができますか? –

+0

さて、私はそれを0.00と比較しました。結果はいずれの場合も同じ結果に終わった。 –

答えて

1

おそらく数値問題です。したがって、0に非常に近いかもしれませんが、正確には0にはならない可能性があります。代わりにwhile(fmod(bar,1.00) > 1e-10)を試してください。

+0

それは正確な倍数を見つける良い方法ではありません... –

+0

私はこれを試しましたが、無限ループを引き起こしました。上記のコメントに解決策が見つかりましたが、とにかく感謝しています! –