180

したがって、Pythonには正と負の無限大があります。

float("inf"), float("-inf")

これは、いくつかの注意が必要なタイプの機能のように思えます。知っておくべきことはありますか?

4

5 に答える 5

102

Pythonの実装IEEE-754標準に非常によく準拠しており、ガイダンスとして使用できますが、コンパイルされた基盤となるシステムに依存しているため、プラットフォームの違いが発生する可能性があります。最近¹、 「無限大」と「無限大」を許可する修正が適用されましたが、ここではそれほど重要ではありません。

次のセクションは、IEEE浮動小数点演算を正しく実装するすべての言語に同様に当てはまります。Pythonだけに固有のものではありません。

不平等の比較

無限大および大なり小なり演算子を処理>する<場合、次のことが重要になります。

  • を含む任意の数+inf-inf
  • を含む任意の数-inf+inf
  • +inf高くも低くもない+inf
  • -inf高くも低くもない-inf
  • 関係する比較NaNはすべて偽です(inf高くも低くもありませんNaN

平等のための比較

等しいかどうかを比較すると、とは等しく、+inf+infは等しく-infなり-infます。これは非常に議論の余地のある問題であり、物議を醸すように聞こえるかもしれませんが、IEEE標準であり、Pythonはそのように動作します。

もちろん、+infは等しくなく、それ自体-infを含むすべてのものはに等しくありません。NaNNaN

無限大での計算

両方のオペランドが無限大でない限り、無限大を使用したほとんどの計算では無限大が生成されます。演算の除算またはモジュロ、またはゼロを使用した乗算では、次の点に注意してください。

  • 結果が定義されていないゼロを掛けると、次のようになります。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.powpowまたは**動作しないため、注意が必要です。2つの実数の結果が高すぎて倍精度浮動小数点数に収まらない場合(無限大を返す必要があります)、オーバーフロー例外をスローしますが、入力がまたはの場合、正しく動作し、またはのいずれかをinf返します。2番目の引数が。の場合、最初の引数が。でない限り、を返します。さらに多くの問題がありますが、すべてがドキュメントでカバーされているわけではありません。-infinf0.0NaNNaN1.0
  • math.expと同じ問題が発生しmath.powます。オーバーフローに対してこれを修正する解決策は、次のようなコードを使用することです。

    try:
        res = math.exp(420000)
    except OverflowError:
        res = float('inf')
    

ノート

注1:追加の警告として、IEEE標準で定義されているように、計算結果がアンダーまたはオーバーフローした場合、結果はアンダーエラーまたはオーバーフローエラーではなく、正または負の無限大に1e308 * 10.0なりますinf

注2: returnを使用した計算、およびそれ自体を含むとの比較はであるため、関数を使用して、数値が実際にであるかどうかを判断する必要がありNaNます。NaNNaNNaNfalsemath.isnanNaN

注3: Pythonは書き込みをサポートしていますが、内部float('-NaN')にサインオンが存在しないため、サインは無視されます。NaN除算-inf / +infすると、結果はNaNではなく、になります-NaN(そのようなことはありません)。

注4: Pythonはコンパイル対象のCまたはJavaライブラリに依存しており、基盤となるすべてのシステムがこの動作をすべて正しく実装しているわけではないため、上記のいずれかに依存するように注意してください。確認したい場合は、計算を行う前に無限大をテストしてください。

¹)最近はバージョン3.2以降を意味します。
²)浮動小数点は正と負のゼロをサポートするため、次のようになります。x / float('inf')符号と-1 / float('inf')yields -0.01 / float(-inf)yields -0.01 / float('inf')yields 0.0、 yieldsを保持し-1/ float(-inf)ます0.0。さらに、それを真にしたくない場合は、手動で符号を確認する必要があります0.0 == -0.0true

于 2009-10-27T00:33:01.467 に答える
98

以下を含む単純な算術から、非数(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

于 2009-10-27T00:31:36.357 に答える
3

C99もそうです。

最新のすべてのプロセッサで使用されているIEEE754浮動小数点表現には、正の無限大(sign = 0、exp =〜0、frac = 0)、負の無限大(sign = 1、exp =〜0、frac = 0)用に予約されたいくつかの特別なビットパターンがあります。 )、および多くのNaN(数値ではない:exp =〜0、frac≠0)。

心配する必要があるのは、一部の演算によって浮動小数点の例外/トラップが発生する可能性があることですが、これらはこれらの「興味深い」定数だけに限定されません。

于 2009-10-27T00:25:05.230 に答える
3

これまで誰も言及していない警告を見つけました。実際の状況で頻繁に発生するかどうかはわかりませんが、ここでは完全を期すためです。

通常、無限大を法とする数を計算すると、それ自体が浮動小数点数として返されますが、無限大を法とする分数は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で見ることができます。

更新:これはPython3.8で修正される予定です。

于 2018-02-28T04:07:18.830 に答える
3

非常に悪い警告: ゼロ除算

ほんの少しでは、それ1/xまでx = 1e-323ですinfが、いつx = 1e-324または少し投げますZeroDivisionError

>>> 1/1e-323
inf

>>> 1/1e-324
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ZeroDivisionError: float division by zero

だから注意してください!

于 2019-10-10T15:35:53.947 に答える