我有一个问题,即表示 [0,1]
区间中概率的变量总和与 0
但应该是 >0
。问题肯定与 floating point representation 和 R
中的精度有关,但我无法确定哪里出错了。
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
都是 numeric
。 p00
也是 numeric
但> p00
[1] 0
p00 == 0
是我机器上的 TRUE
。但是它不应该为零,因为可以证明 p00
在数学上是 >0
。这个问题似乎与
p01
较小有关。但是 p01>0
是 TRUE
仍然适用于我的机器。为什么在 p00
中取最终和时会出错?是否有解决此问题的数字技巧,即获得
p00
的精确表示?再次注意 p
是 [0,1]
中的概率。我考虑使用 log
和 exp
转换,但没有取得一致的成功。 最佳答案
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/