大多数数学库都有许多版本的对数函数。大多数时候,我们认为它们是完美的,但实际上很多只提供一定数量的精度。
对于某些函数,存在数值上更稳定的变体。例如 Fortran、R、Java 和 C 都具有Math.log1p
, 用于计算log(1.0+x)
(它为较小的 x 值提供更高的精度)和对应的expm1
. 这里的数字问题是由精度损失引起的 - 如果x
真的很小,则1.0 + x
丢失数字以保留开头的 1。
我已经看到在许多情况下可以提高精度的此类功能。每当您以高数值精度实现分布函数(Gamma、Beta、Poisson 等)时,这似乎很常见。例如 Gamma 函数似乎大部分时间用作logGamma
. 一般来说,转到“logspace”可以大大提高精度,因此 R 似乎在大多数函数上都有一个“logspace”标志。
log1mexp
另一个例子,在 R中,存在log(1 - exp(p))
:
http ://cran.r-project.org/web/packages/Rmpfr/vignettes/log1mexp-note.pdf
我一直在玩熵和信息论测量。有一个非常常见的术语
p * -log(p)
通常,人们希望对数的底为 2,而不是 e;但通常这只是一个线性因素,您也可以使用自然对数(所以这对我来说并不重要)。无论如何,您知道是否有更快/更直接/更精确的方法来计算这个术语?我到处都有它,所以它真的可以让它更精确和更快(节省我通常的“过早优化”的东西,谢谢)。
我看不出有任何明显的原因会导致精度下降。所以我最感兴趣的是是否有任何好的技巧来加速这个计算。这甚至可以节省我处理p=0
极端情况(明智地是0
,尽管log(0)
不存在)或免费给我以 2 为底的情况(尽管与常数的单次乘法显然不是致命的昂贵)。谢谢。