我正在尝试以低相对误差的双精度浮点实现以下函数:
这在统计应用程序中广泛使用,以添加在对数空间中表示的概率或概率密度。当然,或都可能容易上溢或下溢,这很糟糕,因为日志空间首先用于避免下溢。这是典型的解决方案:
取消确实发生了,但被减轻了。更糟糕的是当和接近时。这是一个相对误差图:
处被截断,以强调曲线的形状,在该曲线上发生取消。我已经看到高达的错误,并怀疑它会变得更糟。(FWIW,“ground truth”函数是使用 MPFR 的 128 位精度的任意精度浮点数实现的。)
我尝试了其他的重新配方,结果都是一样的。使用作为外部表达式,通过取一个接近 1 的值的日志会发生同样的错误。使用作为外部表达式,取消发生在内部表达式中。
现在,绝对误差很小,所以具有非常小的相对误差(在一个 epsilon 内)。有人可能会争辩说,因为对概率(不是对数概率)真的很感兴趣,这个可怕的相对错误不是问题。它可能通常不是,但我正在编写一个库函数,我希望它的客户能够指望相对误差不比舍入误差差多少。
看来我需要一种新方法。可能是什么?