直接追逐我想创建一个计算步长的函数。
这就是我所拥有的:
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]
有没有解决这个问题?
答案 0 :(得分:5)
由于浮点运算的工作原理,这是表示错误。请参阅Python文档中的以下页面:Floating Point Arithmetic: Issues and Limitations。
FTA:
请注意,这是二进制浮点的本质:这不是Python中的错误,也不是代码中的错误。您将在支持硬件浮点运算的所有语言中看到相同的类型(尽管某些语言默认情况下可能无法显示差异,或者在所有输出模式下都显示差异。)
如需进一步阅读,请参阅以下页面:
答案 1 :(得分:1)
你想要的准确度如何?以上精确到15dp。
答案 2 :(得分:1)
答案 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。