为什么在python中使用math.sin(math.pi)会出现错误?

为什么在python中使用math.sin(math.pi)会出现错误?,python,Python,我在使用math.sin(math.pi)时注意到一个小故障。 答案应该是0,但实际上是1.2246467991473532e-16。 如果语句是math.sin(math.pi/2),那么答案是1.0,这是正确的。 为什么会出现这种错误 结果是正常的:计算机中的数字通常用表示,精度有限(它们只存储在几个字节中)。这意味着只有有限数量的实数可以用浮点数表示。特别是,π不能精确表示,因此math.pi不是π,而是它的一个很好的近似值。这就是为什么math.sin(math.pi)不一定是sin(π

我在使用math.sin(math.pi)时注意到一个小故障。 答案应该是0,但实际上是1.2246467991473532e-16。 如果语句是math.sin(math.pi/2),那么答案是1.0,这是正确的。
为什么会出现这种错误

结果是正常的:计算机中的数字通常用表示,精度有限(它们只存储在几个字节中)。这意味着只有有限数量的实数可以用浮点数表示。特别是,π不能精确表示,因此
math.pi
不是π,而是它的一个很好的近似值。这就是为什么
math.sin(math.pi)
不一定是sin(π),而只是非常接近它的东西

您观察到的
math.sin(math.pi)
的精确值是可以理解的:浮点数(双精度)的相对精度约为1e-16。这意味着,
math.pi
可能错误约π*1e-16~3e-16。由于sin(π-ε)~ε,您通过
math.sin(math.pi)
获得的值可能是最坏的情况~3e-16(绝对值),这就是最坏的情况(该计算不应该给出精确的值,而只是给出正确的数量级,确实如此)


现在,
math.sin(math.pi/2)=1这一事实并不令人震惊:可能(我没有检查)是
math.pi/2
(浮点数)非常接近精确值π/2,以至于最接近sin的浮点数(
math.pi/2
)正好是1。一般来说,你可以期望应用于浮点数的函数结果的相对值为1e-16左右(或者是1e-16左右,而不是0)。

这非常接近,不是吗?有限精度浮点数的精度有限,0.0000000000000001非常接近0。math.sin(math.pi)=1.22e-16,但仍然是math.sin(math.pi/2)=1.0为什么?计算机中不同的正弦实现可能会产生不同的结果()。不过,可能需要为sin(π/2)实现正弦返回1:可能
math.pi/2
与π/2非常接近,以至于
math.sin(math.pi/2)
理想情况下应该更接近1,而不是任何其他浮点值。我改写了最后一段,以便更清楚地讨论sin(π/2)。