답변:
다음과 관련된 간단한 산술에서 숫자가 아닌 (NaN) 값을 계속 얻을 수 있습니다 inf
.
>>> 0 * float("inf")
nan
일반적으로 일반적인 산술 계산을 통해 값을 얻지 못합니다inf
.
>>> 2.0**2
4.0
>>> _**2
16.0
>>> _**2
256.0
>>> _**2
65536.0
>>> _**2
4294967296.0
>>> _**2
1.8446744073709552e+19
>>> _**2
3.4028236692093846e+38
>>> _**2
1.157920892373162e+77
>>> _**2
1.3407807929942597e+154
>>> _**2
Traceback (most recent call last):
File "<stdin>", line 1, in ?
OverflowError: (34, 'Numerical result out of range')
이 inf
값은 비정상적인 의미를 가진 매우 특별한 값으로 간주되므로 계산에 자동 OverflowError
으로 inf
값을 주입 하는 것보다 예외를 통해 즉시 알 수 있습니다.
**
약간의 버그가있는 것 같습니다. 이 실수로 넘쳐 때 오류가 발생합니다, 그러나 그것의 피연산자 중 하나가있는 경우 inf
또는 -inf
, 그것은 반환하거나 0.0
또는 inf
. 그렇게 하지 제대로 일을 입력 inifinty 때,하지만 결과는 무한대해야하지 않을 때.
파이썬의 구현 은 IEEE-754 표준을 잘 따르므로 지침으로 사용할 수 있지만 컴파일 된 기본 시스템에 의존하므로 플랫폼 차이 가 발생할 수 있습니다. 최근 ¹에는 "inf"뿐만 아니라 "무한" 을 허용하는 수정 사항이 적용 되었지만 여기서는 그다지 중요하지 않습니다.
다음 섹션은 IEEE 부동 소수점 산술을 올바르게 구현하는 모든 언어에 동일하게 적용되며 Python에만 국한되지는 않습니다.
무한대보다 크 >
거나 작은 <
연산자를 다룰 때 다음과 같은 것이 중요합니다.
+inf
보다-inf
-inf
보다+inf
+inf
되는 둘 이상도 낮추지 보다+inf
-inf
보다 높거나 낮지 않다 -inf
NaN
가 거짓입니다 ( inf
보다 높거나 낮음 NaN
).지 어떤지를 비교, 때 +inf
와 +inf
동일한, 같은있다 -inf
및 -inf
. 이것은 논란의 여지가 많은 문제이며 논란의 여지가 있지만 IEEE 표준에 있으며 Python은 그와 같이 작동합니다.
물론 +inf
같지 -inf
않으며, NaN
그 자체를 포함한 모든 것은 같지 않습니다 NaN
.
무한대를 사용한 대부분의 계산은 두 피연산자가 모두 무한대가 아닌 한, 연산 나누기 또는 모듈로 또는 0을 곱하는 경우 명심해야 할 몇 가지 특별한 규칙이 있습니다.
NaN
0.0
또는 -0.0
².NaN
.inf - inf
하면 결과가 정의되지 않습니다. NaN
;inf - -inf
결과는 다음과 같습니다 inf
.-inf - inf
결과는 다음과 같습니다 -inf
.-inf - -inf
하면 결과가 정의되지 않습니다 NaN
.inf + inf
결과는 다음과 같습니다 inf
.inf + -inf
하면 결과가 정의되지 않습니다. NaN
;-inf + inf
하면 결과가 정의되지 않습니다. NaN
;-inf + -inf
결과는 -inf
입니다.math.pow
, pow
또는 것은 **
예상대로이 작동하지 않는, 까다 롭습니다. 그것은 두 개의 실수와 결과는 (은 무한대를 반환해야합니다) 배정 밀도 부동 소수점에 맞게 너무 높은 오버 플로우 예외가 발생하지만, 입력되는 경우 inf
또는 -inf
, 올바르게 반환 중 하나와 동작 inf
또는 0.0
. 두 번째 인수가이면 첫 번째 인수가 아닌 한을 NaN
반환합니다 . 더 이상 문제 가 있지만 문서에서 모두 다루지는 않습니다 .NaN
1.0
math.exp
와 같은 문제가 발생합니다 math.pow
. 오버플로로이를 해결하는 솔루션은 다음과 유사한 코드를 사용하는 것입니다.
try:
res = math.exp(420000)
except OverflowError:
res = float('inf')
참고 1 : IEEE 표준에 정의 된대로 계산 결과가 오버플로 또는 오버플로 인 경우 결과는 언더 또는 오버플로 오류가 아니라 양수 또는 음의 무한대 : 1e308 * 10.0
yields가 inf
됩니다.
참고 2 :NaN
반환 NaN
을 NaN
포함한 계산과 NaN
자체를 포함한 모든 계산이 포함 되므로이 함수를 false
사용하여 math.isnan
숫자가 실제로 있는지 확인해야합니다 NaN
.
참고 3 : Python은 쓰기를 지원하지만 내부에 float('-NaN')
부호가 없으므로 부호는 무시 NaN
됩니다. 를 나누면 -inf / +inf
결과는 NaN
아닙니다 -NaN
( 그렇지 않습니다 ).
참고 4 : Python은 컴파일 된 C 또는 Java 라이브러리에 의존하고 모든 기본 시스템이이 모든 동작을 올바르게 구현하지는 않으므로 위의 내용에주의해야합니다. 확실하게하려면 계산을 수행하기 전에 무한대를 테스트하십시오.
¹) 최근 버전 3.2 이후를 의미 합니다.
²) 부동 소수점은 양수와 음수 0을 지원하므로 x / float('inf')
부호와 -1 / float('inf')
수율 -0.0
, 1 / float(-inf)
수율 -0.0
, 1 / float('inf')
수율 0.0
및 -1/ float(-inf)
수율을 유지 0.0
합니다. 또한 0.0 == -0.0
is은true
원하지 않는 경우 수동으로 부호를 확인해야합니다.
-1 * float('infinity') == -inf
C99도 마찬가지 입니다.
모든 최신 프로세서에서 사용되는 IEEE 754 부동 소수점 표현에는 양의 무한대 (sign = 0, exp = ~ 0, frac = 0), 음의 무한대 (sign = 1, exp = ~ 0, frac = 0)를 위해 예약 된 몇 가지 특수 비트 패턴이 있습니다. ) 및 많은 NaN (숫자가 아님 : exp = ~ 0, frac ≠ 0).
당신이 걱정해야 할 모든 것 : 일부 산술은 부동 소수점 예외 / 트랩을 일으킬 수 있지만 이러한 "관심있는"상수에만 국한되지는 않습니다.
OverflowError
됩니다.
지금까지 아무도 언급하지 않은 경고를 발견했습니다. 나는 그것이 실제 상황에서 자주 나타날지 모르겠지만 여기서는 완전성을 기하기위한 것입니다.
일반적으로, 수 모듈로 무한대를 계산하면 자체가 부동 소수로 반환되지만 분수 모듈로 무한대는 nan
숫자가 아닌 숫자를 반환합니다 . 예를 들면 다음과 같습니다.
>>> from fractions import Fraction
>>> from math import inf
>>> 3 % inf
3.0
>>> 3.5 % inf
3.5
>>> Fraction('1/3') % inf
nan
Python 버그 추적기에 문제를 제기했습니다. https://bugs.python.org/issue32968 에서 볼 수 있습니다 .
업데이트 : 이것은 Python 3.8에서 수정됩니다 .
1e309
로 해석됩니다+inf
및-1e309
해석됩니다-inf
.