我正在阅读What Every Computer Scientist Should Know About Floating-Point Arithmetic。我发现了一个有趣的定理:(如果你已经读过这篇文章,你可以跳到最后一段。)
定理4
如果使用公式计算ln(1 + x):
当0≤x<0时,相对误差至多为5ε。如果用保护数字执行减法,则e <3。 0.1和ln计算到1/2 ulp。
此公式适用于x的任何值,但仅对x&lt;&lt; 1,这是在幼稚公式ln(1 + x)中发生灾难性取消的地方。虽然这个公式可能看起来很神秘,但有一个简单的解释,说明它的工作原理。将ln(1 + x)写为
可以精确计算左手因子,但是当向x添加1时,右手因子μ(x)= ln(1 + x)/ x将遭受大的舍入误差。然而,μ几乎是常数,因为ln(1 + x)≈x。因此稍微改变x不会引入太多错误。换句话说,如果x̄≈x,则计算xμ(x̄)将是xμ(x)= ln(1 + x)的良好近似。是否有x̄的值可以准确计算x̄和x̄+ 1?有;即x̄=(1 x) 1,因为那时1 +x̄正好等于1 x。
根据作者的说法,1 +x̄完全等于1 x。这使我感到困惑:当x非常小时,将x加1会导致信息丢失在x的低位。此外,(1 x) 1将会发生灾难性取消,这将导致许多准确的数字消失。