logo

Pythonのfloatの範囲

Python では、 浮動小数点の範囲 値は実装とプラットフォームによって異なります。 Python 言語仕様では、次のことのみが要求されます。 浮動小数点 数字は少なくともサポートします 1e-308 1e+308 少なくとも次の精度で 53ビット

実際には、最新の Python 実装のほとんどでは、 IEEE 754 浮動小数点標準。およその範囲を提供します。 1.7e-308 1.7e+308 の精度で 53ビット 。この範囲はすべてのプラットフォームで同じであり、float 組み込みタイプでサポートされます。

ただし、浮動小数点演算は、特に非常に大きな数値または非常に小さな数値に対して演算を実行する場合、丸め誤差やその他の不正確さの原因となる可能性があることに注意することが重要です。場合によっては、予期しない動作やバグが発生する可能性があります。

これらの問題を回避するには、多くの場合、次の使用が推奨されます。 10進数 または 固定小数点 金銭の値や高精度が必要なその他のアプリケーションを扱う場合の算術。の 10進モジュール Python では、構成可能な精度で固定小数点演算がサポートされており、これらのアプリケーションでは浮動小数点演算の優れた代替手段となります。

性能試験

IEEE 754 標準は、Python を含むほとんどの最新のプログラミング言語で使用される浮動小数点数の範囲と精度を定義します。この標準では、浮動小数点数の 2 つの基本形式が定義されています。

    単精度形式

それは使用しています 32ビット そしておよそを提供します 小数点7 桁の精度。

    倍精度フォーマット

それは使用しています 64ビット そしておよそを提供します 10進数16 桁の精度。

Pythonは使用します 倍精度 デフォルトでは浮動小数点数です。つまり、浮動小数点数の範囲はおよそ 1.7e-308 1.7e+308 の精度で 53ビット 。この範囲は、次の式を使用して表すことができる最大および最小の指数によって決まります。 11ビット を使用して表すことができる最大および最小の仮数部 (つまり、数値の小数部) と組み合わせます。 52ビット

浮動小数点演算の実際の精度は、数値をメモリに保存する方法、演算の順序、丸めモードの選択など、多くの要因の影響を受ける可能性があります。場合によっては、微妙な丸め誤差やその他の不正確さの原因となる可能性があります。

これらの問題を回避するために、非常に大きな数値または非常に小さな数値を扱う場合、または高精度が必要な場合は、代替アプローチを使用することが推奨されます。 例えば:

  1. 使用 固定小数点演算 または 小数演算 これにより、小数点以下の桁数が固定され、丸め誤差が回避されます。
  2. 使用 任意精度 のようなライブラリ 'mpmath' または 「gmpy2」 これにより、非常に高い精度で計算を実行し、丸め誤差を回避できます。

注意すべき重要な点の 1 つは、Python で浮動小数点数の算術演算を実行する場合、浮動小数点演算の仕組みが原因で予期しない動作が発生する可能性があることです。

算術演算によっては、浮動小数点演算を使用して正確に表現できない非常に小さい数値または非常に大きい数値が生成される場合があります。このような場合、結果は次のようになります。 丸い または 切り詰められた 、予期しない動作や計算の不正確さにつながります。

浮動小数点演算 ではありません 連想的な つまり、操作を実行する順序が結果に影響を与える可能性があります。例えば、 (a + b) + c と等しくない可能性があります a + (b + c) 丸め誤差やその他の不正確さの原因が原因です。

浮動小数点演算もできません 分配的な 、つまり、 (a + b) * c と等しくない可能性があります a * c + b * c 丸め誤差やその他の不正確さの原因が原因です。これらの問題の影響を最小限に抑えるために、より正確かつ信頼性の高い方法で浮動小数点数の算術演算を実行する関数を提供する数学モジュールまたはその他の数値ライブラリを使用することが推奨されることがよくあります。また、浮動小数点数が等しいかどうかを比較することを避け、代わりに許容しきい値または他の方法を使用して 2 つの値の差の大きさを比較することも推奨されます。

例:

例を見てその方法を見てみましょう 浮動小数点演算 Python で予期しない動作が発生する可能性があります。

 a = 0.1 b = 0.2 c = 0.3 result1 = (a + b) + c result2 = a + (b + c) print(result1) print(result2) 

出力:

 0.6000000000000001 0.6 

説明:

この例では、同じ値を使用して 2 つの異なる計算を実行しています。 a、b、 そして c 。最初の計算では、次のように追加します。 ある そして b まず結果を追加します c 。 2 番目の計算では、次のように追加します。 b そして c まず結果を追加します ある

2 つの計算では同じ値が使用されるため、同じ結果が得られることが期待できます。 a、b 、 そして c 。ただし、浮動小数点演算の制限により、2 つの計算ではわずかに異なる結果が生成されます。

最初の計算では次の結果が得られます。 0.6000000000000001 、2 番目の計算では次の結果が生成されます。 0.6 。これは、丸め誤差やその他の不正確さの原因により、最初の計算の中間結果が 2 番目の計算の中間結果とわずかに異なるためです。

これらの問題を回避するには、多くの場合、 10進モジュール またはその他の実行方法 算術演算 の上 浮動小数点 より正確かつ信頼性の高い方法で数値を取得します。

例えば:

 import decimal a = decimal.Decimal('0.1') b = decimal.Decimal('0.2') c = decimal.Decimal('0.3') result1 = (a + b) + c result2 = a + (b + c) print(result1) print(result2) 

出力:

 0.6 0.6 

説明:

この例では、 10進モジュール を使用して同じ計算を実行するには 固定小数点 精度の算術演算 1 小数点以下の桁。これにより、丸め誤差やその他の不正確さの原因となる可能性のあるものを回避できます。 浮動小数点 算術。その結果、両方の計算で次の同じ結果が得られます。 0.6