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

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

np.tan(np.pi/2)

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

16331239353195370.0

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

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



답변

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 배정 밀도)을 사용하기 때문에 “거의 모든”상자에서 동일합니다. 당신은 그것에 확인하려면 위의 방법 중 하나를 사용할 수 있습니다 귀하의 상자 또는 상자가 예외 인 경우 사용되는 정확한 근사치를 찾을 수 있습니다.


답변