따라서 파이썬에는 양의 무한대와 음의 무한대가 있습니다.
float("inf"), float("-inf")
이것은주의해야 할 기능 유형과 같습니다. 내가 알아야 할 것이 있습니까?
답변
다음과 관련된 간단한 산술에서 숫자가 아닌 (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
값을 주입 하는 것보다 예외를 통해 즉시 알 수 있습니다.
답변
파이썬의 구현 은 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을 곱하는 경우 명심해야 할 몇 가지 특별한 규칙이 있습니다.
- 결과가 정의되지 않은 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
원하지 않는 경우 수동으로 부호를 확인해야합니다.
답변
C99도 마찬가지 입니다.
모든 최신 프로세서에서 사용되는 IEEE 754 부동 소수점 표현에는 양의 무한대 (sign = 0, exp = ~ 0, frac = 0), 음의 무한대 (sign = 1, exp = ~ 0, frac = 0)를 위해 예약 된 몇 가지 특수 비트 패턴이 있습니다. ) 및 많은 NaN (숫자가 아님 : exp = ~ 0, frac ≠ 0).
당신이 걱정해야 할 모든 것 : 일부 산술은 부동 소수점 예외 / 트랩을 일으킬 수 있지만 이러한 “관심있는”상수에만 국한되지는 않습니다.
답변
지금까지 아무도 언급하지 않은 경고를 발견했습니다. 나는 그것이 실제 상황에서 자주 나타날지 모르겠지만 여기서는 완전성을 기하기위한 것입니다.
일반적으로, 수 모듈로 무한대를 계산하면 자체가 부동 소수로 반환되지만 분수 모듈로 무한대는 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에서 수정됩니다 .
답변
아주 나쁜 경고 : 0으로 나누기
A의 1/x
분획물, 최대 x = 1e-323
그것입니다 inf
하지만 때 x = 1e-324
또는 작은 그것을 던졌습니다ZeroDivisionError
>>> 1/1e-323
inf
>>> 1/1e-324
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ZeroDivisionError: float division by zero
조심하세요!