Python cos(90)和cos(270)不是0

时间:2012-11-06 22:15:51

标签: python math cos

发生了什么事?

测试sin和cos函数,找出在将坐标输出到SVG文件时,为什么我在错误的位置上得到如此漂亮的定位。所以我制作了这个测试代码,我可以预测答案是找出原因。奇怪的是,没有任何影响计算的东西会增加这种行为,而只是我将要留下的位置。如果位置为0并且在计算后将变为0,则它​​将不起作用,但如果position为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

2 个答案:

答案 0 :(得分:8)

实际上,这是一个非常低的数字,非常接近于零。这是一篇很棒的文章,可以帮助您了解花车的常见挑战和陷阱:“What Every Computer Scientist Should Know About Floating-Point Arithmetic

答案 1 :(得分:5)

您正在处理舍入错误,这些错误在(大多数情况下)在使用浮点数学时是不可避免的(请参阅已由其他人链接的paper以确切了解正在发生的事情)。

在许多情况下,您可以减少其影响(通过以“智能”顺序执行操作或以更“浮点友好”方式重新表达您的表达式),但在您的情况下最简单的做法是简单地结果如下6位小数,并对它感到高兴。当然,你不需要更高的定位精度,你将得到你所期望的“规范”角度的结果。