我有一个问题,即表示 [0,1] 区间中概率的变量总和与 0 但应该是 >0 。问题肯定与 floating point representationR 中的精度有关,但我无法确定哪里出错了。

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

p11 = p1 * p2
p10 = p1 - p11
p01 = p2 - p11
p00 = 1 - p11 - p10 - p01
p11, p10, p01 都是 numericp00 也是 numeric
> p00
[1] 0
p00 == 0 是我机器上的 TRUE。但是它不应该为零,因为可以证明 p00 在数学上是 >0

这个问题似乎与p01较小有关。但是 p01>0TRUE 仍然适用于我的机器。为什么在 p00 中取最终和时会出错?

是否有解决此问题的数字技巧,即获得 p00 的精确表示?再次注意 p[0,1] 中的概率。我考虑使用 logexp 转换,但没有取得一致的成功。

最佳答案

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

编辑:使用 stings 定义 mpfr

关于r - 以接近 0 和 1 的概率进行计算时,如何提高 R 的精度?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49263169/

10-11 12:07