programing

Python Infinity - 주의 사항이 있습니까?

topblog 2023. 6. 12. 21:03
반응형

Python Infinity - 주의 사항이 있습니까?

Python은 양의 무한대와 음의 무한대를 가지고 있습니다.

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

이것은 단지 주의해야 할 기능의 유형처럼 보입니다.제가 주의해야 할 것이 있습니까?

Python의 구현은 지침으로 사용할 수 있는 IEEE-754 표준을 꽤 잘 따르고 있지만 컴파일된 기본 시스템에 의존하므로 플랫폼 차이가 발생할 수 있습니다.최근에는 "inf"뿐만 아니라 "inf"도 허용하는 수정이 적용되었지만, 여기서는 그것이 사소한 것입니다.

다음 섹션은 IEEE 부동 소수점 산술을 올바르게 구현하는 모든 언어에 동일하게 적용됩니다. Python에만 국한된 것은 아닙니다.

부등식 비교

무한대를 다룰 때 그리고 더 큰 것을 다룰 때.>보다 <연산자, 다음 카운트:

  • 을포한임수의의를 포함한 +inf보다 높습니다.-inf
  • 을포한임수의의를 포함한 -inf 낮음+inf
  • +inf보다 높지도 낮지도 않습니다.+inf
  • -inf보다 높지도 낮지도 않습니다.-inf
  • 에 관련된 모든 비교.NaNinf높지도 낮지도 .NaN)

동등성에 대한 비교

때 평과비교을때했등때,,+inf그리고.+inf동등한 것, 있는 그대로.-inf그리고.-inf이것은 많은 논쟁의 여지가 있는 문제이고 여러분에게 논란의 여지가 있는 것처럼 들릴 수도 있지만, 이것은 IEEE 표준에 있고 Python은 바로 그렇게 행동합니다.

물이야론.+inf는 동와하않은과 않습니다.-inf그고포함모것든들한리▁including것thing들,▁every를 포함한 모든 것.NaN 자체는 그자는체, 불합니다등평에▁to와 같지 .NaN.

무한대를 사용

무한대를 사용하는 대부분의 계산은 두 피연산자가 무한대가 아닌 한 무한대를 생성합니다. 연산 분할이나 모듈로 또는 0을 사용하는 곱셈을 사용하는 경우 다음과 같은 특별한 규칙을 염두에 두어야 합니다.

  • 을 곱하면 이 됩니다.NaN

  • 수를 무한대로 때, (나) 은눌떤수, 산출량로를 합니다.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하며 " 르게동고다중하반환합니다를나음올바하작▁either다반니합환▁behaves▁it▁returns▁correctly"를 반환합니다.inf또는0.0가 두 번 다 인 같 때 을 과 음 가 째 수NaN그것은 돌아옵니다.NaN가 첫 번 아 한 닌 이 장 주가 한1.0문서에서 모두 다루는 것이 아니라 더 많은 문제가 있습니다.

  • math.exp는 와동한문겪니다습를제와 같은 있습니다.math.pow오버플로를 해결하기 위한 해결책은 다음과 유사한 코드를 사용하는 것입니다.

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

메모들

참고 1: IEEE 표준에 정의된 추가적인 주의 사항으로, 계산 결과가 언더(under) 또는 오버플로(overflow) 오류가 아니라 플러스(positive) 또는 마이너스(negative) 무한대(negative)가 될 것입니다.1e308 * 10.0 확량수inf.

참고 2: 사용한 모든 계산은NaN아온다를 합니다.NaN 와 교 해 수 있 것 은 는 볼 비 것 은과의 .NaN를 포함하여, 을 포함하여NaN가 그자체가입니다.false함수를 사용하여 숫자가 정말인지 확인해야 합니다.NaN.

참고 3: Python은 쓰기를 지원하지만float('-NaN')호가무니다됩에 가 없기 부호가 존재하지 않기 때문입니다.NaN내부적으로나누면,-inf / +inf는 결는과입니다.NaN,것은 아니다.-NaN(그런 것은 없습니다).

참고 4: Python은 컴파일된 C 또는 Java 라이브러리에 의존하며 모든 기본 시스템이 이 모든 동작을 올바르게 구현하는 것은 아니기 때문에 위의 모든 동작에 의존하도록 주의하십시오.확인하려면 계산을 수행하기 전에 무한대를 테스트하십시오.


◦ 최근 버전 3.2 이후를 의미합니다.
0과 의 0을 과 같습니다. ²) 부동을소은양및음 0지로다음같다습니과므원하수수점수을다같습니▁support다).x / float('inf')그것의 기호를 유지하고 그리고.-1 / float('inf') 확량수-0.0,1 / float(-inf) 확량수-0.0,1 / float('inf') 확량수0.0그리고.-1/ float(-inf) 확량수0.0또한, 기호가 참이 되지 않으려면 수동으로 확인해야 합니다.

다음을 포함하는 간단한 산술에서 not-a-number(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값이 자동으로 계산에 주입됩니다.

C99도 마찬가지입니다.

모든 최신 프로세서에서 사용되는 IEEE 754 부동소수점 표현에는 양의 무한대(sign=0, exp=~0, frac=0), 음의 무한대(sign=1, exp=~0, frac=0) 및 많은 NaN(not a Number: 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

파이썬 버그 트래커에 대한 문제를 제출했습니다.그것은 https://bugs.python.org/issue32968 에서 볼 수 있습니다.

업데이트: 이것은 Python 3.8에서 수정될 예정입니다.

매우 나쁜 경고: 0으로 나눗셈

순식간에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

그러니 조심하세요!

언급URL : https://stackoverflow.com/questions/1628026/python-infinity-any-caveats

반응형