문제

가끔 무한대가 생성되는 복잡한 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
>>> 

Decimal은 더 큰 숫자를 처리할 수 있지만 분명히 성능 저하가 있습니다(그리고 json으로 직렬화할 수 없습니다).

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

다음은 오버플로 예외를 발생시키지 않는 추가의 예입니다.

>>> a=1e308
>>> a+a
inf
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top