我猜测有一些标准技巧我无法找到:无论如何我想计算一个非常接近的数字的大功率(想想1-p,其中p <1e-17)数值稳定的时尚。1-p在我的系统上被截断为1。

使用对数的泰勒膨胀我获得以下界限

是有什么聪明的我可以做吗?

有帮助吗?

解决方案

您可以通过使用log(1+x)函数来更准确地计算|x| <= 1

一个例子:

> p <- 1e-17
> log(1-p)
[1] 0
> log1p(-p)
[1] -1e-17
.

和另一个:

> print((1+1e-17)^100, digits=22)
[1] 1
> print(exp(100*log1p(-1e-17)), digits=22)
[1] 0.9999999999999990007993
. 然而,在这里,我们受限于基于log1p类型的FP算法的准确性(参见每个计算机科学家应该了解浮点算术)。

另一种方式是使用例如。double(a.k.a.多重精度浮点可靠)包:

> options(digits=22)
> library(Rmpfr)
> .N <- function(.) mpfr(., precBits = 200) # see the package's vignette
> (1-.N(1e-20))^100
1 'mpfr' number of precision  200   bits 
[1] 0.99999999999999999900000000000000005534172854579042829381053529
.

包使用Rmpfrgsl库来实现任意精密FP操作(当然,计算速度较慢的成本)。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top