문제
따라서 파이썬은 긍정적이고 부정적인 무한대를 가지고 있습니다.
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
값은 계산에 조용히 주입됩니다.
다른 팁
Python의 구현 다음을 따릅니다 IEEE-754 표준 꽤 잘 지침으로 사용할 수는 있지만 편집 된 기본 시스템에 의존합니다. 플랫폼 차이 발생할 수 있습니다. 최근에는 수정이 적용되었습니다 "Infinity"와 "inf", 그러나 여기에서는 매우 중요합니다.
다음 섹션은 IEEE 플로팅 포인트 산술을 올바르게 구현하는 모든 언어에 똑같이 적용되며 파이썬에만 국한되지 않습니다.
불평등에 대한 비교
무한대와 더 큰 것을 다룰 때 >
또는 덜 <
연산자, 다음 계산 :
- 포함 된 모든 번호
+inf
보다 높습니다-inf
- 포함 된 모든 번호
-inf
보다 낮습니다+inf
+inf
~이다 높거나 낮은 것도 아닙니다 ~보다+inf
-inf
높거나 낮은 것보다 낮습니다-inf
- 관련된 모든 비교
NaN
거짓입니다 (inf
높거나 낮은 것보다 낮습니다NaN
)
평등에 대한 비교
평등과 비교할 때 +inf
그리고 +inf
그대로 동일합니다 -inf
그리고 -inf
. 이것은 논쟁의 여지가 많은 문제이며 당신에게 논란의 여지가 있지만 IEEE 표준에 있으며 파이썬은 그렇게 행동합니다.
물론, +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')
메모
Note 1: 추가 경고로, IEEE 표준에 의해 정의 된대로, 계산 결과가 언더 또는 오버플로 인 경우 결과는 언더 플로우 오류가 아니라 긍정적 또는 부정적인 무한대가됩니다. 1e308 * 10.0
수율 inf
.
노트 2: 계산하기 때문에 NaN
보고 NaN
그리고 그와의 비교 NaN
, 포함 NaN
그 자체입니다 false
, 당신은 그것을 사용해야합니다 math.isnan
숫자가 실제로 있는지 확인하는 기능 NaN
.
노트 3: 파이썬은 글쓰기를 지원하지만 float('-NaN')
, 표시가 없기 때문에 표시가 무시됩니다. NaN
내부적. 당신이 분열하는 경우 -inf / +inf
, 결과는 NaN
, 아니다 -NaN
(그와 같은 일은 없다).
Note 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
~이다 true
, 부호가 사실이되기를 원하지 않으면 수동으로 사인을 확인해야합니다.
또한 C99.
모든 현대 프로세서에서 사용하는 IEEE 754 플로팅 포인트 표현에는 양의 무한대 (부호 = 0, exp = ~ 0, frac = 0), 음의 무한대 (부호 = 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 Bug Tracker에 문제를 제기했습니다. 볼 수 있습니다 https://bugs.python.org/issue32968.
업데이트 :이게 될 것입니다 파이썬 3.8에서 고정.