python中准确的trig

时间:2010-12-13 17:23:08

标签: python

直接追逐我想创建一个计算步长的函数。

这就是我所拥有的:

def humanstep(angle):
    global human
    human[1]+=math.sin(math.radians(angle))*0.06
    human[2]+=math.cos(math.radians(angle))*0.06

因此,如果角度为90,则x值(人[1])应等于0.06,y值等于0.

相反,弧度和度数之间的转换并不完美,并返回这些值。

[5.99999999999999, 3.6739403974420643e-16]

有没有解决这个问题?

7 个答案:

答案 0 :(得分:5)

由于浮点运算的工作原理,这是表示错误。请参阅Python文档中的以下页面:Floating Point Arithmetic: Issues and Limitations

FTA:

  

请注意,这是二进制浮点的本质:这不是Python中的错误,也不是代码中的错误。您将在支持硬件浮点运算的所有语言中看到相同的类型(尽管某些语言默认情况下可能无法显示差异,或者在所有输出模式下都显示差异。)

如需进一步阅读,请参阅以下页面:

答案 1 :(得分:1)

你想要的准确度如何?以上精确到15dp。

答案 2 :(得分:1)

如果您想要准确的结果,那么您正在正确地执行此操作。

如果您想要数学完全结果,例如[6, 0],请使用符号数学库,例如sympy

请注意,这些目标非常不同。

答案 3 :(得分:0)

你应该阅读floating-point numbers,因为这些计算自然不完美,并且使用Python的浮点数无法准确表示某些数字。 (显然,固定数量的比特不能代表无限多的实数。

简短的回答是否定的。如果你愿意,你可以绕圈。

答案 4 :(得分:0)

正如其他人所说,这是浮点错误。您可以使用Decimal模块,它可以为您提供任意精度数学

答案 5 :(得分:0)

如果要避免浮点数固有的表示问题,可以使用Decimal,但需要实现自己的三角函数。这将获得任意精度,但它会相当慢。

答案 6 :(得分:0)

正如大家所说,这与二进制表示问题有关 - 0.06不是二进制的“圆形”数字(就像1/3不是十进制)。它与trig函数无关。如果你放弃它们只是这样做:

human[1]+=0.06
human[2]+=0.0

并查看结果,您会看到相同的结果。

然而,在Python 2.7中,浮点数的表示已得到改进。它现在将显示给出该二进制数的最短十进制数 - 在这种情况下,我认为它将显示您期望的答案(此处仅运行2.5,因此我无法快速测试)。有关详细信息,请参阅this article