为什么在Python中使用math.sin(math.pi)会出错?
我在使用 math.sin(math.pi) 的时候发现了一个问题。正常情况下,结果应该是 0,但实际上却得到了 1.2246467991473532e-16。
如果我用 math.sin(math.pi/2),结果是 1.0,这个是对的。
那么,为什么会出现这个错误呢?
1 个回答
3
结果是正常的:在计算机中,数字通常用浮点数来表示,这种表示方式的精度是有限的(它们只占用几个字节存储)。这意味着浮点数只能表示有限数量的真实数字。特别是,π无法被精确表示,所以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的误差最多大约是2e-16。泰勒展开显示,math.sin(math.pi/2)
应该在1的范围内误差不超过2e-32:因此,最接近的浮点数(相对精度大约是1e-16)就是1(浮点数可以精确表示1)。
一般来说,你可以期待对浮点数应用的函数结果与真实值的误差大约是1e-16(或者说结果可能是1e-16而不是0)。