Python trig函数不返回匹配的结果

时间:2015-03-09 20:43:55

标签: python-2.7 math trigonometry

当我使用math模块进行三角计算时,我发现了一些相当有趣的内容,使用tansincos

如上所述,所有数学教科书,在线资源和课程都是如此:

  

tan(x)= sin(x)/ cos(x)

虽然我在使用三个trig函数时遇到了一些精度错误:

from math import tan, sin, cos

theta = -30
alpha = tan(theta)
omega = sin(theta) / cos(theta)

print(alpha, omega)
print(alpha == omega)

>>> (6.405331196646276, 6.4053311966462765)
>>> (False)

我为theta尝试了几个不同的值,结果的最后一位数字已经消失了一点点。

我有什么遗失的东西吗?

3 个答案:

答案 0 :(得分:3)

这个问题是因为有限的浮点精度(并非所有实数都可以精确表示,并且并非所有计算都精确)。可访问的指南位于Python docs

使用默认值,"双精度"浮点表示,你永远不能希望优于大约15位小数位精度,并且涉及这些数字的计算将倾向于降低这种精度(上述注释中提到的舍入误差)。以同样的方式,您可以从以下内容获得False

In [1]: 0.01 == (0.1)**2
Out[1]: False

因为Python不是0.1,而是#34;最接近的可表示数字"到0.1,它既不是0.01也不是最接近的可表示的数字到0.01。

斯坦利已经给出了正确的方法来测试&#34;平等&#34;在一些绝对容差范围内:(abs(a-b) < tol)其中tol是您选择的符合预期精度的小数字。

答案 1 :(得分:2)

正如您所发现的,在比较浮点数时存在一定程度的不精确性。测试“相等”的常用方法是确定您想要接受的合理差异量(通常称为“epsilon”),并将两个数字之间的差异与最大误差进行比较:

epsilon = 1E-14

print(alpha, omega)
print(alpha == omega)
print(abs(alpha - omega) < epsilon)

答案 2 :(得分:1)

首先你应该注意到三角函数的参数是以弧长给出的,而不是以度为单位。因此,θ= -30指的是以度为单位的-30 * 180 / pi的角度。

其次,处理器和调用数学库有单独的内部程序来计算tan和(sin,cos)。额外的除法运算失去1/2到1位的精度,这解释了结果的差异。