我在使用math.sin(math.pi)时发现了一个小故障。 答案应该是0,但它是1.2246467991473532e-16。 如果语句是math.sin(math.pi / 2),答案是1.0,这是正确的。 为什么这个错误?
答案 0 :(得分:2)
结果是正常的:计算机中的数字通常用 floats 表示,它们具有有限的精度(它们仅存储在几个字节中)。这意味着浮点数只能表示有限数量的实数。特别是,π不能精确表示,因此math.pi
不是π,而是非常好的近似值。这就是为什么math.sin(math.pi)
不必须是罪(π)而只是非常接近它的原因。
您为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)。