在计算概率接近0和1时,如何提高R的精度?

tom*_*mka 5 floating-point precision r

我有一个问题,即表示[0,1]区间总和的概率的变量之和0应该是>0.问题肯定与浮点表示和精度有关R,但我无法确定它出错的地方.

options(digits = 22)
p1 = 0.8
p2 = 0.9999999999999998

p11 = p1 * p2
p10 = p1 - p11
p01 = p2 - p11
p00 = 1 - p11 - p10 - p01
Run Code Online (Sandbox Code Playgroud)

p11, p10, p01都是numeric.p00也numeric不过

> p00
[1] 0
Run Code Online (Sandbox Code Playgroud)

和p00 == 0是TRUE我的机器上.但是它不应该是零,因为它可以证明p00是>0数学.

这个问题似乎与p01小的事实有关.不过p01>0是TRUE仍然适用我的机器上.为什么在拿到最后一笔钱时会出错p00?

是否有一个数字技巧来解决这个问题,即得到一个精确的表示p00?请再次注意p概率[0,1].我考虑使用log和exp转换但没有一致的成功.

gdk*_*rmr 6

R本身只能处理64位浮点数,该Rmpfr包可以处理任意精度浮点数:

library(Rmpfr)

> p1 = mpfr("0.8", 128)
> p2 = mpfr("0.9999999999999998", 128)

> p11 = p1 * p2
> p10 = p1 - p11
> p01 = p2 - p11
> p00 = 1 - p11 - p10 - p01

> p00
1 'mpfr' number of precision  128   bits 
[1] 4.00000000000000000000000461461738779728e-17
Run Code Online (Sandbox Code Playgroud)

编辑:使用stings来定义 mpfr