ホームページ  >  記事  >  バックエンド開発  >  浮動小数点演算の落とし穴を克服して正確な計算を行うにはどうすればよいですか?

浮動小数点演算の落とし穴を克服して正確な計算を行うにはどうすればよいですか?

DDD
DDDオリジナル
2024-10-21 14:53:02564ブラウズ

How to Overcome Pitfalls in Floating Point Arithmetic for Accurate Calculations?

浮動小数点演算の落とし穴: 克服する方法

Python などのプログラミング言語で一般的に使用される 10 進数ベースの浮動小数点演算は、近似的な性質のため、微妙な誤差が生じます。これらの誤差を理解することは、正確な計算を行うために非常に重要です。

問題

浮動小数点加算を使用して平方根を推定する次の Python 関数を考えてみましょう。

<code class="python">def sqrt(num):
    root = 0.0
    while root * root < num:
        root += 0.01
    return root

しかし、この関数は不正確な結果を生成します:

<code class="python">>>> sqrt(4)
2.0000000000000013
>>> sqrt(9)
3.00999999999998</code>

浮動小数点の問題

問題は、Python の浮動小数点値がは 10 進数の正確な表現ではありません。代わりに、バイナリ表現が使用されるため、バイナリ形式で正確に表現できない数値を扱う場合、不正確さが生じる可能性があります。

関数例では、0.01 の加算は、次の理由により 1/100 の加算と同等ではありません。このおおよその表現。実際に追加される値は 1/100 よりわずかに大きく、若干過大評価されます。

浮動小数点エラーの克服

これらのエラーを回避するには、次の戦略を検討してください。

  • Use Decimal モジュール:

Python の 10 進数モジュールは、10 進数に基づく固定小数点表現を使用する代替型 Decimal を提供します。これにより、変更された関数に見られるように、より正確な計算が可能になります:

<code class="python">from decimal import Decimal as D

def sqrt(num):
    root = D(0)
    while root * root < num:
        root += D("0.01")
    return root</code>
  • バイナリ表現可能な値を使用:

浮動小数点に固執0.125 (1/8) や 0.0625 (1/16) など、正確な 2 進分数を表す加算。これにより、丸め誤差が発生することなく加算が正確になることが保証されます。

浮動小数点誤差を理解し、克服することは、正確な数値計算に不可欠です。適切な戦略を採用することで、開発者はこれらのエラーを最小限に抑え、より正確な結果を達成できます。

以上が浮動小数点演算の落とし穴を克服して正確な計算を行うにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。