在python代码中生成的无穷大

UsA*_*R33 6 python infinity

我正在查看一些复杂的Python 2.6代码,偶尔会导致生成无穷大(至少一个Infinity被json库序列化 - 它检查w/math.isinf).

特别令人困惑的是,Python(据我所知)不应该能够将计算结果设置为无穷大.我错了这个假设吗?我知道你只能从常数得到无穷大:

k = float('inf')
k = 1e900
Run Code Online (Sandbox Code Playgroud)

Joh*_*ooy 13

介于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
>>> 
Run Code Online (Sandbox Code Playgroud)

十进制可以处理更大的数字,但显然存在性能损失(并且它不能用json序列化)

>>> from decimal import Decimal
>>> Decimal('1e900')/10
Decimal("1E+899")
Run Code Online (Sandbox Code Playgroud)

这是一个不会引发溢出异常的添加示例

>>> a=1e308
>>> a+a
inf
Run Code Online (Sandbox Code Playgroud)