2012-11-06 100 views
4

这是怎么回事?Python cos(90)和cos(270)不是0

测试出sin和cos函数,找出为什么当我将坐标输出到SVG文件时,为什么我会在错误的位置获得如此精美的定位。所以我制作了这个测试代码,我可以预测答案是找出原因。奇怪的是,没有任何影响计算的东西会自我增加这种行为,而只是我即将停留的位置。如果位置为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 

现在我改变CX至3,即使它不会影响计算这是它的工作原理:

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

该计算的结果加到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,或者如果您故意传递了这个“稍微错误”的值,它只是试图给你所收到参数的余弦值。您可以在评估后总是舍入返回值,但如果自动舍入,则无法获得精确度。 –