有改进的计算


11

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

对于某些功能,在数值上更稳定。例如,Fortran,R,Java和C都具有Math.log1p用于计算log(1.0+x)(对于较小的x值可提供更高的精度)和对应的expm1。此处的数字问题是由于精度降低而引起的-如果精度x很小,则会1.0 + x丢失数字以保留开头的1。

在许多情况下,我已经看到了此类功能以提高精度。每当您以较高的数字精度实现分布函数(Gamma,Beta,泊松等)时,这似乎都是很常见的。例如,伽玛函数似乎大部分时间都用作logGamma。通常,转到“ logspace”可以大大提高精度,因此R似乎在大多数函数上都有一个“ logspace”标志。

R中的另一个示例存在log1mexplog(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
m10308pM10308|logp|700plogpp=0

R附带有一个log2函数,根据您的操作系统,它可以是一个简单的包装程序,log/log(2)也可以利用C99添加了一个log2函数这一事实。
2013年

Answers:


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.