回答:
それでも、次のような単純な算術から非数(NaN)値を取得できますinf
。
>>> 0 * float("inf")
nan
通常、通常の算術計算では値を取得しないことに注意してください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
静かにあなたの計算に注入された値を。
**
は少しバギーのようです。実数でオーバーフローするとエラーがスローされますが、オペランドのいずれかがinf
また-inf
はの場合は、0.0
またはを返しますinf
。したがって、入力が無限大の場合は正しく機能しますが、結果が無限大になる場合は正しく機能しません。
Pythonの実装は、ガイダンスとして使用できるIEEE-754標準にかなり準拠していますが、コンパイルされた基礎となるシステムに依存しているため、プラットフォームの違いが発生する可能性があります。最近¹、「無限大」と「INF」を可能にする修正が適用されました、ここではそれほど重要ではありません。
以下のセクションは、IEEE浮動小数点演算を正しく実装するすべての言語に等しく適用されます。これは、Pythonだけに固有のものではありません。
無限大およびより大きい>
か小さい<
演算子を処理する場合、次のことが重要です。
+inf
は-inf
-inf
は+inf
+inf
ある高も低くもないよりも、+inf
-inf
より高くも低くもない -inf
NaN
はすべてfalse(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
が返されます。他にも問題があり、すべてがドキュメントでカバーされているわけではありません。NaN
1.0
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
istrue
である場合は、サインをtrueにしたくない場合は手動でチェックする必要があります。
-1 * float('infinity') == -inf
C99も同様です。
最近のすべてのプロセッサで使用されているIEEE 754浮動小数点表現には、正の無限大(sign = 0、exp =〜0、frac = 0)、負の無限大(sign = 1、exp =〜0、frac = 0)用に予約されたいくつかの特別なビットパターンがあります。 )、そして多くのNaN(非数:exp =〜0、frac≠0)。
心配する必要があるのは、一部の算術は浮動小数点の例外/トラップを引き起こす可能性があることですが、これらはこれらの「興味深い」定数だけに限定されません。
OverflowError
。
これまで誰も言及していない警告を見つけました。それが実際の状況で頻繁に現れるかどうかはわかりませんが、ここでは完全を期すためです。
通常、無限大を法とする数値を計算すると、それ自体が浮動小数点として返されますが、無限大を法とする小数が返されます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で修正されます。
1e309
はと解釈され+inf
、-1e309
と解釈されることに注意してください-inf
。