私はいくつかの複雑な Python 2.6 コードを調べています。これにより、無限大が生成されることがあります (少なくとも、json ライブラリによってシリアル化されている無限大 - math.isinf をチェックします)。
特に困惑しているのは、Python (私が知る限り) が無限に設定された計算結果を生成できないことです。この仮定は間違っていますか?定数からは無限大しか得られないことに気付きました:
k = float('inf')
k = 1e900
1e308 と 1e309 の間のどこかで float は精度を使い果たします。そのため、その範囲を超える結果を計算している場合は 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