6

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

特别令人困惑的是,Python(据我所知)不应该能够产生设置为无穷大的计算结果。我对这个假设有误吗?我知道你只能从常量中得到无穷大:

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

1 回答 1

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
>>> 

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

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

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

>>> a=1e308
>>> a+a
inf
于 2009-12-01T08:33:54.930 回答