したがって、Pythonには正と負の無限大があります。
float("inf"), float("-inf")
これは、いくつかの注意が必要な機能のタイプのようです。知っておくべきことはありますか?
inf
を含む単純な算術演算から、非数(NaN)値を取得することもできます。
>>> 0 * float("inf")
nan
通常not通常の算術計算でinf
値を取得することに注意してください:
>>> 2.0**2
4.0
>>> _**2
16.0
>>> _**2
256.0
>>> _**2
65536.0
>>> _**2
4294967296.0
>>> _**2
1.8446744073709552e+19
>>> _**2
3.4028236692093846e+38
>>> _**2
1.157920892373162e+77
>>> _**2
1.3407807929942597e+154
>>> _**2
Traceback (most recent call last):
File "<stdin>", line 1, in ?
OverflowError: (34, 'Numerical result out of range')
inf
値は異常なセマンティクスを持つ非常に特別な値と見なされるため、OverflowError
値を暗黙的に計算に挿入するのではなく、inf
値を例外からすぐに知ることをお勧めします。
Pythonの実装 は IEEE-754標準 にかなり準拠しており、ガイダンスとして使用できますが、コンパイルされた基礎となるシステムに依存しています、 プラットフォームの違い が発生する可能性があります。最近¹、 「無限大」と「inf」 を許可する修正が適用されましたが、ここではあまり重要ではありません。
以下のセクションは、IEEE浮動小数点演算を正しく実装するすべての言語に等しく適用されます。これはPythonだけに固有のものではありません。
無限大および>
より大きい演算子または<
より小さい演算子を扱う場合、以下がカウントされます。
+inf
を含む任意の数が-inf
よりも大きい-inf
を含む任意の数が+inf
よりも小さい+inf
は+inf
よりも 高くも低くもない-inf
は-inf
よりも高くも低くもないNaN
を含む比較はすべて偽です(inf
はNaN
よりも高くも低くもありません)等しいかどうかを比較すると、+inf
と+inf
は等しく、-inf
と-inf
も等しくなります。これは非常に議論の多い問題であり、議論の余地があるかもしれませんが、IEEE規格にあり、Pythonはそのように動作します。
もちろん、+inf
は-inf
と等しくなく、NaN
自体を含むすべてがNaN
と等しくありません。
両方のオペランドが無限である場合、演算の除算またはモジュロ、またはゼロとの乗算がある場合を除き、無限を使用したほとんどの計算では無限が生成されます。
NaN
が生成されます。0.0
または -0.0
²が生成されます。NaN
です。inf - inf
を実行すると、結果は未定義になります:NaN
;inf - -inf
を実行すると、結果はinf
になります。-inf - inf
を実行すると、結果は-inf
になります。-inf - -inf
を実行すると、結果は未定義になります:NaN
。inf + inf
を実行すると、結果はinf
になります。inf + -inf
を実行すると、結果は未定義になります:NaN
;-inf + inf
を実行すると、結果は未定義になります:NaN
;-inf + -inf
を実行すると、結果は-inf
になります。math.pow
、pow
、または**
の使用は、本来の動作をしないため、注意が必要です。 2つの実数の結果が高すぎて倍精度浮動小数点数に収まらない場合(無限大を返す必要があります)、オーバーフロー例外をスローしますが、入力がinf
または-inf
の場合、正しく動作し、inf
または0.0
を返します。 2番目の引数がNaN
の場合、最初の引数が1.0
でない限り、NaN
を返します。すべての がdocs でカバーされているわけではありませんが、さらに問題があります。math.exp
には、math.pow
と同じ問題があります。これをオーバーフロー用に修正する解決策は、次のようなコードを使用することです。
try:
res = math.exp(420000)
except OverflowError:
res = float('inf')
注1:追加の注意事項として、IEEE標準で定義されているように、計算結果がアンダーまたはオーバーフローした場合、結果はアンダーになりません-またはオーバーフローエラーですが、正または負の無限大:1e308 * 10.0
はinf
を生成します。
注2:NaN
を使用した計算ではNaN
が返され、NaN
自体を含むNaN
との比較はfalse
であるため、 math.isnan
を使用する必要があります 数値が実際にNaN
であるかどうかを判別する関数。
注3:Pythonはfloat('-NaN')
の書き込みをサポートしていますが、NaN
には内部的に符号がないため、符号は無視されます。 -inf / +inf
を除算すると、結果は-NaN
ではなくNaN
になります(そのようなことはありません)。
注4:PythonはCまたはJavaに依存するため、上記のいずれかに依存するよう注意してください_コンパイルされたライブラリであり、すべての基礎となるシステムがこの動作をすべて正しく実装しているわけではありません。確認したい場合は、計算を行う前に無限大をテストします。
¹)最近は バージョン3.2 以降を意味します。
²)浮動小数点は正および負のゼロをサポートするため、x / float('inf')
は符号を保持し、-1 / float('inf')
は-0.0
を生成し、1 / float(-inf)
は-0.0
を生成し、1 / float('inf')
は0.0
および-1/ float(-inf)
を生成し、0.0
を生成します。さらに、 0.0 == -0.0
はtrue
であるため、trueにしたくない場合は手動で記号を確認する必要があります。
C99 も同様です。
最新のすべてのプロセッサで使用されるIEEE 754浮動小数点表現には、正の無限大(sign = 0、exp =〜0、frac = 0)、負の無限大(sign = 1、exp =〜0、frac = 0 )、および多くのNaN(非数:exp =〜0、frac≠0)。
心配する必要があるのは、算術によっては浮動小数点の例外/トラップが発生する可能性があることですが、それらはこれらの「興味深い」定数だけに限定されません。
これまで誰も言及していなかった警告を見つけました。実際の状況で頻繁に発生するかどうかはわかりませんが、ここでは完全を期すためです。
通常、無限大を法とする数値を計算すると浮動小数点数として返されますが、無限大を法とする小数部はnan
(数値ではない)を返します。以下に例を示します。
>>> from fractions import Fraction
>>> from math import inf
>>> 3 % inf
3.0
>>> 3.5 % inf
3.5
>>> Fraction('1/3') % inf
nan
Pythonバグトラッカーに問題を提出しました。 https://bugs.python.org/issue32968 で見ることができます。
更新:これは Python 3.8で修正 になります。