2012-11-06 5 views
4

무슨 일 이니?파이썬 cos (90) 및 cos (270) 0이 아닙니다.

SVG 파일에 내 좌표를 출력 할 때 왜 잘못된 위치에서 너무 아름다운 위치를 얻는 지 알아보기 위해 sin 함수와 cos 함수를 테스트합니다. 그래서이 테스트 코드를 만들었습니다.이 테스트 코드는 왜 그 대답이 무엇인지 예측할 수 있습니다. 이상하게도 계산에 영향을 미치는 것은 아무 것도 없지만이 행동을 스스로 추가하지만 단순히 내가 머무를 위치에 대한 위치를 추가합니다. 위치가 0이고 계산 후 0이되면 작동하지 않지만 위치가 1이면 계산 후 1이됩니다.

첫 번째 테스트 :

import math 

cX = 2 
cY = 2 
r = 2 

rcX = cX + (r * math.cos(math.radians(0))) 
rcY = cY + (r * math.sin(math.radians(0))) 

print rcX #4 
print rcY #2 
r = 1 

rlX = rcX + (r * math.cos(math.radians(90))) 
rlY = rcY + (r * math.sin(math.radians(90))) 

print rlX #4 
print rlY #3 
r = 4 

flX = rlX + (r * math.cos(math.radians(180))) 
flY = rlY + (r * math.sin(math.radians(180))) 

print flX #0 
print flY #3 
r = 2 

print r * math.cos(math.radians(270)) 
print flX + (r * math.cos(math.radians(270))) #-3.67394039744e-16 should be 0 
print flY + (r * math.sin(math.radians(270))) #1 

은 지금은 3 CX를 변경하고이 계산에 영향을주지 않는 경우에도 그것은 작동 :

r * math.cos(math.radians(270)) 

은 그 계산의 결과에 추가됩니다 the x 좌표

import math 

cX = 3 
cY = 2 
r = 2 

rcX = cX + (r * math.cos(math.radians(0))) 
rcY = cY + (r * math.sin(math.radians(0))) 

print rcX #5 
print rcY #2 
r = 1 

rlX = rcX + (r * math.cos(math.radians(90))) 
rlY = rcY + (r * math.sin(math.radians(90))) 

print rlX #5 
print rlY #3 
r = 4 

flX = rlX + (r * math.cos(math.radians(180))) 
flY = rlY + (r * math.sin(math.radians(180))) 

print flX #1 
print flY #3 
r = 2 

print r * math.cos(math.radians(270)) 
print flX + (r * math.cos(math.radians(270))) #1 
print flY + (r * math.sin(math.radians(270))) #1 
+6

"-3.67394039744e-16"은 충분히 가깝습니다. – Mysticial

+0

당신은 어떤 결과물을 얻고 있습니까? – Wug

+2

라디안으로 변환 할 때 반올림 오류가 발생한다는 것을 알고 계십니까? –

답변

5

당신은 지혜로운 일을 할 때 (대부분) 피할 수없는 반올림 오류를 다루고 있습니다. h 부동 소수점 연산 (paper을 참조하십시오.

"지능형"순서로 작업을 수행하거나보다 "부동 소수점 친화적 인"방식으로 표현식을 재구성하여 영향을 줄일 수 있지만 대부분의 경우 가장 간단한 방법은 결과는 예를 들어 소수점 6 자리에 만족해야합니다. 확실하게 위치 지정에 더 많은 정밀도가 필요하지 않으며 "표준"각도에 대해 기대하는 결과를 얻을 수 있습니다.

+0

어떻게이 기능을 시작할 수 없습니까? 전체 종이를 읽지는 않았지만 흥미로운 것 같습니다. – Andreas

+2

'cos'는 인수가 반올림 오류의 영향을받는 7/4pi인지 또는 의도적으로 "약간 잘못된"값을 전달한 경우 수신 한 인수의 코사인을 제공하려고 시도한다는 것을 알지 못합니다. 평가 후에 반환 값을 항상 반올림 할 수 있지만 자동으로 반올림하면 정밀도를 다시 얻을 수 없습니다. –