浮動小数点数をC++で使用し、forループのインクリメントとして数字を0.1の倍数として使用すると何度か起こります。ループ反復子は正確に0.1の倍数ではありませんが、予測不可能に他の加算または減算された1^-17の小数があります。どうすればそれを避けることができますか?浮動小数点数を扱うときに不規則な小さな数値を避ける
答えて
浮動小数点数を反復処理しないでください。
浮動小数点で0.1を正確に表すことができないという問題があります。したがって、代わりに次のようなものを実行する必要があります。
一番良いのは、毎回「0.1」を追加しているからです。論理的に正確に表現可能な数字になっても(たとえば「1.0」のように)、彼はそうでないかもしれません。だから 'for(float f = 0.0f; f <1.0; f + = 0.1f)'のような行は、9回しか反復しないかもしれません。 – corsiKa
浮動小数点を扱う場合の、excellent articleです。正確にあなたの例をカバーする議論があります - 0.1の増分:
for (double r=0.0; r!=1.0; r+=0.1) printf("*");
それが印刷しようとしているどのように多くの星は?十?それを実行して驚かせてください。このコードは、私たちがそれを打破するまで星を印刷し続けます。
問題はどこですか?すでにわかっているように、倍精度は無限に正確ではありません。我々がここで遭遇した問題は次のとおりです。バイナリでは、0.1の表現は有限ではありません(ベース10にあるように)。 10進数0.1は2進数0.0(0011)に相当し、かっこ内の部分は永遠に繰り返されます。 0.1がdouble変数に格納されると、最も近い表現可能な値に丸められます。したがって、10回追加すると、結果は1に正確には等しくなりません。
浮動小数点数が多い場合は、記事全体を読むことを強くお勧めします。
- 1. 浮動小数点値と浮動小数点値の比較
- 2. 浮動小数点数浮動小数点数値
- 3. Redis:大きな浮動小数点数
- 4. 浮動小数点数は浮動小数点数ですか?
- 5. 浮動小数点型の浮動小数点数を使用している浮動小数点数は、浮動小数点数の上位16桁です。
- 6. 浮動小数点の浮動小数点が正しく浮動しない
- 7. Android - 数値(浮動小数点)ソフトキーボード
- 8. 浮動小数点数
- 9. IE7浮動小数点浮動小数点問題
- 10. jQuery animateNumber - 浮動小数点浮動小数点の方法
- 11. 浮動小数点浮動小数点浮動小数点浮動小数点数 - 浮動小数点数を持つ2つの要素:左に動くようにdivを配置する右のスタイル
- 12. キャンバスと浮動小数点
- 13. 浮動小数点の不正確
- 14. 浮動小数点 - 正規表現
- 15. CSSが浮動小数点数の浮動小数点数の問題
- 16. 32651:浮動小数点浮動小数点浮動小数点エラーのルビー比較
- 17. C++がPythonに浮動小数点浮動小数点を変換する
- 18. 浮動小数点要素を浮動小数点要素にする
- 19. 浮動小数点数が同じ有意な小数点以下を持つ
- 20. Rubyの整数と小数点に浮動小数点を分割する
- 21. バイナリ固定小数点のbyte []を浮動小数点値に変換する
- 22. Zend_Formと浮動小数点数のローカライゼーション
- 23. PHP浮動小数点数2小数点
- 24. "。" zendバリデータの浮動小数点数の小数点以下は
- 25. 浮動小数点値が突然大きくなる
- 26. 階層内の異なるレベルのCSS浮動小数点を避ける
- 27. LIなし浮動小数点リストLI
- 28. 数値を浮動小数点数にソートする - アスキーオーダーではない - Pythonで
- 29. 小数点を含む浮動小数点書式
- 30. php oci_bind_by_name浮動小数点数を
浮動小数点を反復処理に使用しないでください。 – Pubby
http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html –
反復に*正確でない*浮動小数点を使用しないでください。 0.125のような正確な数値は、IEEE 754バイナリでは問題ありません(もちろん、十分な数の範囲にとどまっている限り)。 – kennytm