Бесконечность, сгенерированная в коде Python - PullRequest
6 голосов
/ 01 декабря 2009

Я просматриваю некоторый сложный код Python 2.6, который иногда приводит к генерированию бесконечности (по крайней мере, бесконечность сериализуется библиотекой json - которая проверяет w / math.isinf).

Что особенно удивляет, так это то, что Python (насколько я могу судить) не должен быть в состоянии когда-либо выдавать результаты вычислений с бесконечностью. Я не прав с этим предположением? Я знал, что вы можете получить бесконечность только от констант:

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

1 Ответ

13 голосов
/ 01 декабря 2009

Где-то между 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...