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