我正在寻找在其上偶尔导致无限远一些复杂的Python代码2.6产生(至少一个无限由JSON库序列 - 它检查瓦特/ 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
>>> 

十进制可以处理更大的数字,但显然有性能上的损失(和它不能与JSON被序列)

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

下面是加成不提高溢出异常的一个例子

>>> a=1e308
>>> a+a
inf
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top