문제
가끔 무한대가 생성되는 복잡한 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
제휴하지 않습니다 StackOverflow