6

私はいくつかの複雑な Python 2.6 コードを調べています。これにより、無限大が生成されることがあります (少なくとも、json ライブラリによってシリアル化されている無限大 - math.isinf をチェックします)。

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

k = float('inf')
k = 1e900
4

1 に答える 1

13

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
于 2009-12-01T08:33:54.930 に答える