質問

ときどき無限が生成される複雑なPython 2.6コードを見ています(少なくともjsonライブラリによってシリアライズされるInfinity-math.isinfをチェックします)。

特に困惑させているのは、Pythonが(私が知る限り)無限に設定された計算結果を生成することができないことです。この仮定は間違っていますか?定数からのみ無限大を取得できることに気付きました:

k = float('inf')
k = 1e900
役に立ちましたか?

解決

1e308と1e309の間のどこかでフロートの精度が不足しているため、その範囲を超える結果を計算している場合、infが表示されます

>>> 1e308
1e+308
>>> 1e309
inf

>>> json.dumps(1e308,allow_nan=False)
'1e+308'
>>> json.dumps(1e309,allow_nan=False)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python2.6/json/__init__.py", line 237, in dumps
    **kw).encode(obj)
  File "/usr/lib/python2.6/json/encoder.py", line 367, in encode
    chunks = list(self.iterencode(o))
  File "/usr/lib/python2.6/json/encoder.py", line 304, in _iterencode
    yield floatstr(o, self.allow_nan)
  File "/usr/lib/python2.6/json/encoder.py", line 47, in floatstr
    raise ValueError(msg)
ValueError: Out of range float values are not JSON compliant: inf
>>> 

Decimalはより大きな数を処理できますが、明らかにパフォーマンスが低下します(jsonでシリアル化できません)

>>> from decimal import Decimal
>>> Decimal('1e900')/10
Decimal("1E+899")

これは、オーバーフロー例外を発生させない追加の例です

>>> a=1e308
>>> a+a
inf
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top