当我使用math
模块进行三角计算时,我发现了一些相当有趣的内容,使用tan
,sin
和cos
。
如上所述,所有数学教科书,在线资源和课程都是如此:
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
尝试了几个不同的值,结果的最后一位数字已经消失了一点点。
我有什么遗失的东西吗?
答案 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位的精度,这解释了结果的差异。