数字的力量接近1

时间:2014-06-03 10:26:18

标签: r floating-point floating-point-precision numerical-stability

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

使用对数的泰勒展开式,我得到以下界限

formula

我能做些什么更聪明的事吗?

1 个答案:

答案 0 :(得分:8)

您可以使用log(1+x)功能更准确地为|x| <= 1计算log1p

一个例子:

> 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

然而,在这里,我们受限于基于double类型的FP算法的准确性(参见What Every Computer Scientist Should Know About Floating-Point Arithmetic)。

另一种方法是使用例如Rmpfr(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

该软件包使用gslmpfr库来实现任意精度FP操作(当然,代价是计算速度较慢)。