Python 2.7 Python触发器函数不返回匹配的结果

Python 2.7 Python触发器函数不返回匹配的结果,python-2.7,math,trigonometry,Python 2.7,Math,Trigonometry,我在使用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

我在使用
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)
In [1]: 0.01 == (0.1)**2
Out[1]: False
我尝试了两个不同的θ值,结果的最后一个数字有一点偏离


有什么我遗漏的吗?

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

使用默认的“双精度”浮点表示法,您永远不可能期望精度超过15位小数,涉及此类数字的计算将倾向于降低该精度(上述注释中提到的舍入误差)。同样,您可以通过以下方式获得
False

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)
In [1]: 0.01 == (0.1)**2
Out[1]: False
因为Python不是将0.1平方,而是将“最接近的可表示数字”平方为0.1,这既不是0.01,也不是最接近0.01的可表示数字


D Stanley给出了在某个绝对公差范围内测试“相等性”的正确方法:(
abs(a-b)
),其中
tol
是您选择的某个小数字,以满足您的预期精度。

此问题是因为浮点精度有限(并非所有实数都能准确表示,也并非所有的计算都是精确的)。中提供了一个可访问的指南

使用默认的“双精度”浮点表示法,您永远不会希望精度超过约15位小数,而涉及此类数字的计算将倾向于降低该精度(上述注释中提到的舍入误差)。同样,您会从以下内容中获得
False

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)
In [1]: 0.01 == (0.1)**2
Out[1]: False
因为Python不是将0.1平方,而是将“最接近的可表示数字”平方为0.1,这既不是0.01,也不是最接近0.01的可表示数字


斯坦利给出了在绝对公差范围内测试“相等”的正确方法:(
abs(a-b)
)其中
tol
是您选择的某个小数字,以符合您的预期精度。

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

epsilon = 1E-14

print(alpha, omega)
print(alpha == omega)
print(abs(alpha - omega) < epsilon)
epsilon=1E-14
打印(α,ω)
打印(α==ω)
打印(abs(α-ω)<ε)

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

epsilon = 1E-14

print(alpha, omega)
print(alpha == omega)
print(abs(alpha - omega) < epsilon)
epsilon=1E-14
打印(α,ω)
打印(α==ω)
打印(abs(α-ω)<ε)

首先,您应该注意到三角函数的参数是以弧长而不是度表示的。因此θ=-30表示以度表示的-30*180/pi的角度


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

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


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

选择一个合理的最小误差(1E-14)对于64位浮点数学而言可能是合理的),并将两个值之间的差异与最大值进行比较。选择您希望接受的合理最小错误(1E-14)对于64位浮点数学而言可能是合理的),并将两个值之间的差异与最大值进行比较。免责声明:我不是Python程序员,因此语法可能有点不正确。免责声明:我不是Python程序员,因此语法可能有点不正确。