我正在查看一些复杂的Python 2.6代码,这些代码偶尔会导致生成无穷大(至少由json库序列化一个无穷大——它检查w/ 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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)