R 接近1的数的幂

R 接近1的数的幂,r,floating-point,floating-point-precision,numerical-stability,R,Floating Point,Floating Point Precision,Numerical Stability,我猜有一些我找不到的标准技巧:无论如何,我想计算一个非常接近1的数字的大的幂(想想1-p,其中p你可以计算log(1+x)对于|x |(1-.N(1e-20))^100更精确 1“mpfr”精度为200位的数字 [1] 0.99999999999999999900000000000000005534172854579042829381053529 该软件包使用gsl和mpfr库来实现任意精度的FP运算(当然要以较慢的计算速度为代价)。另一种选择是因为(1-x^-1)^当x变大时,x趋向于1/e

我猜有一些我找不到的标准技巧:无论如何,我想计算一个非常接近1的数字的大的幂(想想1-p,其中p你可以计算
log(1+x)
对于
|x |(1-.N(1e-20))^100更精确
1“mpfr”精度为200位的数字
[1] 0.99999999999999999900000000000000005534172854579042829381053529

该软件包使用
gsl
mpfr
库来实现任意精度的FP运算(当然要以较慢的计算速度为代价)。

另一种选择是因为(1-x^-1)^当x变大时,x趋向于1/e,你可以用它来计算它为1/e的幂。@James这不会导致与我的上界相同的近似值。即(1-p)^n=[[1-1/(1/p)]^(1/p)]^(np)大约(1/e)^npAh,是的。如果p很小,p^2非常小,所以我认为你可以安全地使用exp(-np)。下界可以重写为exp(-np)^(1+p/2)。很酷,我不知道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
> 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