是否有改进的计算方式日志_( p )plog⁡(p)?

计算科学 浮点 准确性
2021-12-19 04:01:37

大多数数学库都有许多版本的对数函数。大多数时候,我们认为它们是完美的,但实际上很多只提供一定数量的精度。

对于某些函数,存在数值上更稳定的变体。例如 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 为底的情况(尽管与常数的单次乘法显然不是致命的昂贵)。谢谢。

1个回答

plogp在任何地方都不会遭受精度损失[0,1],并且不会遭受附近的指数溢出0任何一个。因此,快速、准确的方法是

p ? p * -log(p) : 0