16331239353195370.0에 특별한 의미가 있습니까?


89

import numpy as np나는 그것을 사용하여

np.tan(np.pi/2)

제목에 숫자가 아니라 np.inf

16331239353195370.0

이 번호가 궁금합니다. 시스템 기계 정밀도 매개 변수와 관련이 있습니까? 뭔가로부터 계산할 수 있었습니까? (나는 비슷한 라인을 따라 생각하고 있습니다 sys.float_info)

편집 : Java, octace, matlab과 같은 다른 환경에서도 동일한 결과를 실제로 재현 할 수 있습니다. 제안 된 복제는 이유를 설명하지 않습니다.



10
나는 그 대답이 마음에 들지 않습니다. 그것은 원인을 설명하는 것이 아니라 완전히 손으로 물결 치는 것입니다. "라디안 단위의 tan (pi / 2)는 본질적으로 무한하지 않습니까?" 왜 OP가 여기에서 물었 듯이 대답 사실 이 아닙니다np.inf . 그러나 그렇지 않은 이유뿐만 아니라 설명하는 간단하지만도에하면 답이 보이는 정확히 무엇인가 이유를 설명 - 그리고 ;-) 내가 한 그렇게
팀 피터스 (Tim Peters)

답변:


119

piPython float로 정확하게 표현할 수 없습니다 (플랫폼 C의 double유형 과 동일 ). 표현 가능한 가장 가까운 근사가 사용됩니다.

내 상자에 사용 된 정확한 근사값은 다음과 같습니다 (아마도 상자와 동일).

>>> import math
>>> (math.pi / 2).as_integer_ratio()
(884279719003555, 562949953421312)

이 비율의 탄젠트를 찾기 위해 이제 wxMaxima로 전환하겠습니다.

(%i1) fpprec: 32;
(%o1) 32
(%i2) tan(bfloat(884279719003555) / 562949953421312);
(%o2) 1.6331239353195369755967737041529b16

그래서 본질적으로 당신이 얻은 것과 동일합니다. 사용되는 이진 근사값 pi/2은의 수학적 ( "무한 정밀도") 값보다 약간 작습니다 pi/2. 따라서 infinity. 대신 매우 큰 접선을 얻습니다 . 계산 된 tan()것은 실제 입력에 적합합니다!

정확히 같은 종류의 이유로

>>> math.sin(math.pi)
1.2246467991473532e-16

0을 반환하지 않습니다. 근사값 math.pi은보다 약간 작으며 pi표시되는 결과는 해당 사실을 고려할 때 정확 합니다.

math.pi를 보는 다른 방법

사용중인 정확한 근사치를 보는 방법에는 여러 가지가 있습니다.

>>> import math
>>> math.pi.as_integer_ratio()
(884279719003555, 281474976710656)

math.pi 그 비율의 수학적 ( "무한 정밀도") 값과 정확히 같습니다.

또는 16 진수 표기법의 정확한 부동 소수점으로 :

>>> math.pi.hex()
'0x1.921fb54442d18p+1'

또는 거의 모든 사람이 가장 쉽게 이해할 수있는 방법으로 :

>>> import decimal
>>> decimal.Decimal(math.pi)
Decimal('3.141592653589793115997963468544185161590576171875')

즉시 명확하지 않을 수도 있지만 모든 유한 이진 부동 소수점은 유한 십진 부동 소수점으로 정확하게 표현할 수 있으며 (반대는 사실 이 아닙니다 . 예를 들어 소수점 0.1은 유한 이진 부동 소수점 으로 정확히 표현할 수 없습니다) Decimal(some_float)생성자는 정확히 동등한 값을 생성합니다.

다음은의 실제 값과 pi의 정확한 십진수 값이며 math.pi세 번째 줄의 캐럿은 서로 다른 첫 번째 숫자를 가리 킵니다.

true    3.14159265358979323846264338327950288419716939937510...
math.pi 3.141592653589793115997963468544185161590576171875
                         ^

math.pi거의 모든 상자가 이제 동일한 이진 부동 소수점 형식 (IEEE 754 배정 밀도)을 사용하기 때문에 "거의 모든"상자에서 동일합니다. 당신은 그것에 확인하려면 위의 방법 중 하나를 사용할 수 있습니다 귀하의 상자 또는 상자가 예외 인 경우 사용되는 정확한 근사치를 찾을 수 있습니다.


@Tim Peters-이것은 완벽하게 명확합니다. 완전성을 위해 나는이 표현이 np.pi시스템의 엡실론 내에서 가장 가까운 합리적인 표현 이라고 추측하고 있습니다 .
Aguy

3
np.piPython과 동일한 값을 갖는다 고 가정하면 math.pi(확인하지는 않았지만 ;-) 할 수 있습니다), 플랫폼의 기본 C double부동 소수점 형식으로 표현할 수있는 수학적 파이에 가장 가까운 값 입니다. 이는 거의 모든 상자에서 IEEE 754 배정 밀도를 의미하므로 53 비트 (가수) 정밀도를 가진 가장 가까운 이진 부동 소수점입니다. 따라서 합리적 집합은 +/- I * 2**J정수 I가 0 또는 2**52 <= I < 2**53인 형식으로 제한되고 정수 범위 J는이 형식의 모든 합리적 범위 를 포함 할 수있을만큼 충분히 넓습니다 pi.
Tim Peters

2
내가 줄 이유이다 사랑 "바이너리"삼각 함수가 더 일반적으로 구현 된 경우. pi는 합리적으로 표현할 수 없기 때문에 0에서 1까지의 각도에서 작동하는 함수 세트에 편리 할 것입니다.
pipe

글쎄, 그들은 수입 np.pi이 아니라 math.pi.
EKons

2
@ Έρικ Κωνσταντόπουλος math.pi, np.piscipy.pi모두 동일합니다. 이름 지정 편의를 위해 복제됩니다. stackoverflow.com/questions/12645547/…
Tim Peters
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.