파이썬 무한-어떤 경고?


179

따라서 파이썬에는 양의 무한대와 음의 무한대가 있습니다.

float("inf"), float("-inf")

이것은주의해야 할 기능 유형과 같습니다. 내가 알아야 할 것이 있습니까?


25
상수가 있습니다 1e309로 해석됩니다 +inf-1e309해석됩니다 -inf.
Chris Taylor

답변:


97

다음과 관련된 간단한 산술에서 숫자가 아닌 (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값을 주입 하는 것보다 예외를 통해 즉시 알 수 있습니다.


8
간단한 float 더하기, 곱하기 등은 행복하게 inf를 생성합니다 : f = 1.3407807929942597e + 154; f * f => inf. OverflowError를 발생시키는 것은 **의 예외 인 것 같습니다.
eregon

@eregon은 실제로 **약간의 버그가있는 것 같습니다. 이 실수로 넘쳐 때 오류가 발생합니다, 그러나 그것의 피연산자 중 하나가있는 경우 inf또는 -inf, 그것은 반환하거나 0.0또는 inf. 그렇게 하지 제대로 일을 입력 inifinty 때,하지만 결과는 무한대해야하지 않을 때.
Abel

2
@Abel 그것은 버그가 아닙니다. 넘침은 숫자가 매우 크다는 것을 의미합니다. 표현하기에는 너무 크지 만 여전히 무한대보다 훨씬 작습니다. 그러한 장소에 무한대를 넣으면 특정 응용 프로그램 논리의 예외 처리기에 유용 할 수 있지만 일반적으로 Python에서는 올바르지 않습니다.
Lutz Prechelt

6
@Lutz 그것이 곱셈으로 나타나면 여전히 일관성이 없습니다. 확실히 big * big도 무한대가 아닙니다.
Richard Rast

100

파이썬의 구현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반환합니다 . 더 이상 문제 가 있지만 문서에서 모두 다루지는 않습니다 .NaN1.0
  • math.exp와 같은 문제가 발생합니다 math.pow. 오버플로로이를 해결하는 솔루션은 다음과 유사한 코드를 사용하는 것입니다.

    try:
        res = math.exp(420000)
    except OverflowError:
        res = float('inf')

노트

참고 1 : IEEE 표준에 정의 된대로 계산 결과가 오버플로 또는 오버플로 인 경우 결과는 언더 또는 오버플로 오류가 아니라 양수 또는 음의 무한대 : 1e308 * 10.0yields가 inf됩니다.

참고 2 :NaN 반환 NaNNaN포함한 계산과 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.0is은true 원하지 않는 경우 수동으로 부호를 확인해야합니다.


11
작은 이쑤시개 : 무한대로 모든 계산이 무한대를 산출하는 것은 아닙니다 :-1 * float('infinity') == -inf
Evan Krall

4
그것이 내가 작은 이쑤시개 라고 말한 이유 입니다. 당신은 무한대로 작업 할 때 표시가 완전히 무시 될 것이라고 걱정했습니다. 다른 사람들을 위해 명확히하고 싶습니다.
Evan Krall

12
음, 거의 : 1 / float ( 'infinity') == 0.0
Phil

3
@ 필 : 당신이 inf 또는 NaN으로 모든 계산 결과를 얻지는 않는다는 것을 보여 주려고 노력하고 있다고 확신하지만, 나는 주석을 통해 읽고있는 다른 사람들에게 명확하게하고 싶었습니다. ') == 0.0은 true입니다. 당신이 무한대에 접근함에 따라, 나눗셈의 결과는 0에 가까워집니다. 나는 그것이 기본 미적분학이라는 것을 알고 있습니다.
앤서니 페이스

1
이 답변이 허용되는 답변보다 훨씬 낫다는 느낌이 듭니다.
Christian Herenz

3

C99도 마찬가지 입니다.

모든 최신 프로세서에서 사용되는 IEEE 754 부동 소수점 표현에는 양의 무한대 (sign = 0, exp = ~ 0, frac = 0), 음의 무한대 (sign = 1, exp = ~ 0, frac = 0)를 위해 예약 된 몇 가지 특수 비트 패턴이 있습니다. ) 및 많은 NaN (숫자가 아님 : exp = ~ 0, frac ≠ 0).

당신이 걱정해야 할 모든 것 : 일부 산술은 부동 소수점 예외 / 트랩을 일으킬 수 있지만 이러한 "관심있는"상수에만 국한되지는 않습니다.


1
내 산수가 너무 크면 inf가 될 수 있습니까?
Casebash

@Casebash 아니오, 원인이 OverflowError됩니다.
wizzwizz4

2

지금까지 아무도 언급하지 않은 경고를 발견했습니다. 나는 그것이 실제 상황에서 자주 나타날지 모르겠지만 여기서는 완전성을 기하기위한 것입니다.

일반적으로, 수 모듈로 무한대를 계산하면 자체가 부동 소수로 반환되지만 분수 모듈로 무한대는 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에서 수정됩니다 .


2

아주 나쁜 경고 : 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

조심하세요!

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.