浮動小数点数を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. ブラウザ内の奇数/不規則な浮動小数点CSS要素
- 4. 浮動小数点数浮動小数点数値
- 5. 「不要な」桁の浮動小数点
- 6. Redis:大きな浮動小数点数
- 7. 浮動小数点数を小数点なしで書く
- 8. 浮動小数点数は浮動小数点数ですか?
- 9. 浮動小数点型の浮動小数点数を使用している浮動小数点数は、浮動小数点数の上位16桁です。
- 10. 浮動小数点の浮動小数点が正しく浮動しない
- 11. 浮動小数点数を浮動小数点数に変換する
- 12. 小数点浮動小数点(C++)
- 13. 変数の浮動小数点浮動小数点
- 14. CSSが浮動小数点浮動小数点を返す
- 15. 浮動小数点数の乗算で浮動小数点を浮動小数点数に比べて高速に行うのはなぜですか?
- 16. Elasticsearchで浮動小数点浮動小数点数をfloatに変換する
- 17. Javascript/jQuery - 浮動小数点数と浮動小数点数()への問題
- 18. 浮動小数点浮動小数点浮動小数点浮動小数点数 - 浮動小数点数を持つ2つの要素:左に動くようにdivを配置する右のスタイル
- 19. IE7浮動小数点浮動小数点問題
- 20. MySqlの浮動小数点浮動小数点データ型
- 21. 中央要素が浮動小数点浮動小数点:左
- 22. jQuery animateNumber - 浮動小数点浮動小数点の方法
- 23. 浮動小数点数列
- 24. は、浮動小数点数
- 25. 浮動小数点数
- 26. SHA256浮動小数点数
- 27. Android - 数値(浮動小数点)ソフトキーボード
- 28. 数値Averagerプログラムが不正な浮動小数点値を返します
- 29. キャンバスと浮動小数点
- 30. 浮動小数点数と小数点の計算
浮動小数点を反復処理に使用しないでください。 – Pubby
http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html –
反復に*正確でない*浮動小数点を使用しないでください。 0.125のような正確な数値は、IEEE 754バイナリでは問題ありません(もちろん、十分な数の範囲にとどまっている限り)。 – kennytm