Python 三角函数未返回匹配结果

Python trig functions not returning matched results

我在使用 math 模块使用 tansincos.[=18 进行三角函数计算时遇到了一些非常有趣的事情=]

如所有数学教科书、在线资源和课程所述,以下为真:

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

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

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 尝试了几个不同的值,结果的最后一位有一点点偏差。

有什么我遗漏的吗?

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

使用默认的 "double precision" 浮点表示法,您永远不能指望小数点后 15 位以上的精度,涉及此类数字的计算往往会降低精度(上文中提到的舍入误差评论)。以同样的方式,你从下面得到False

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

因为 Python 不是 0.1 的平方,而是 "nearest representable number" 到 0.1 的平方,既不是 0.01 也不是最接近 0.01 的可表示数。

D Stanley 给出了在一定的绝对公差范围内测试 "equality" 的正确方法:(abs(a-b) < tol) 其中 tol 是您选择的一些小数字以符合您的预期精度。

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

epsilon = 1E-14

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

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

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