문제

따라서 파이썬은 긍정적이고 부정적인 무한대를 가지고 있습니다.

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에서 고정.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top