以R为单位的计算精度水平

以R为单位的计算精度水平,r,precision,R,Precision,我在R中工作,使用非常小的数字来反映最大似然估计算法中的概率。其中一些数字小至1e-155(或更小)。然而,当有像求和这样简单的事情发生时,精度级别会被截断为最不精确的级别,从而破坏我的计算精度,并产生无意义的结果 例如: > sum(c(7.831908e-70,6.002923e-26,6.372573e-36,5.025015e-38,5.603268e-38,1.118121e-14, 4.512098e-07,4.400717e-05,2.300423e-26,1.31

我在
R
中工作,使用非常小的数字来反映最大似然估计算法中的概率。其中一些数字小至1e-155(或更小)。然而,当有像求和这样简单的事情发生时,精度级别会被截断为最不精确的级别,从而破坏我的计算精度,并产生无意义的结果

例如:

    > sum(c(7.831908e-70,6.002923e-26,6.372573e-36,5.025015e-38,5.603268e-38,1.118121e-14,  4.512098e-07,4.400717e-05,2.300423e-26,1.317602e-58))
    [1] 4.445838e-05
从示例中可以看出,此计算的基础是1e-5,它以非常粗鲁的方式对敏感计算进行取整


有办法解决这个问题吗?为什么
R
选择这样一种奇怪的自动行为?也许它并不是真的这样做,我只是看到了截断形式的结果?在这种情况下,变量中是否存储了精度正确的实际数字

您的结果仅在显示中被截断

尝试:


你的总数没有精度损失。但如果您对此感到担忧,则应使用多精度库:

library("Rmpfr")

x <- c(7.831908e-70,6.002923e-26,6.372573e-36,5.025015e-38,5.603268e-38,1.118121e-14,  4.512098e-07,4.400717e-05,2.300423e-26,1.317602e-58)

sum(mpfr(x, 1024))

# 1 'mpfr' number of precision  1024   bits 
# [1] 4.445837981118120898327314579322617633703674840117902103769961398533293289165193843930280422747754618577451267010103975610356319174778512980120125435961577770470993217990999166176083700886405875414277348471907198346293122011042229843450802884152750493740313686430454254150390625000000000000000000000000000000000e-5
库(“Rmpfr”)

你听说过浮点数吗? 乘法或除法的精度(有效数字)不会损失,只要结果介于两者之间
1.7976931348623157·10^308到4.9·10^−324
(有关详细信息,请参阅链接)

因此,如果您执行
1.0e-30*1.0e-10
操作,结果将是
1.0e-40

但如果您执行
1.0e-30+1.0e-10
操作,结果将是
1.0e-10

为什么?

->可通过计算机工作表示的有限数集。(最多64位2^64个不同的64位数字表示)

不使用像整数那样的直接转换(它们表示从~-2^62到+2^62的
,每个整数->关于从-10^16到+10*16的
)
还是有一种聪明的方法,比如浮点数?从
1.7976931348623157·10^308到-4.9·10^−324
它可以表示/近似有理数吗

因此,在浮点运算中,为了获得更大的范围,求和的精度被牺牲,在求和或减法过程中会出现精度损失,因为可以由(64位浮点数的)分数部分的52位表示的有效数字小于
log10(2^52)~16

如果您查找一个基本的日常示例summary(lm),当参数的p值接近零时,summary()输出
选项(位数=22)
最多应提供22位数字(然后运行计算),从我可以看出这是基本包中可以达到的最高值更高的精度是可以的,但是你应该花一点时间思考一下,在你所做的问题的背景下,这是否有意义。如果你将10^{-70}的概率加上10^{-5}中的一个,在什么情况下,如果较小的概率由于缺乏数值精度而丢失,那么它实际上会有什么影响@BenBolker,这正是我试图理解R如何计算的原因。有时我不得不把一个很小的数取到一个很大的幂(比如,1e-17),然后取到,比如,20的幂
R
实际上甚至可以用三位数(如1e-150或更小)给我一个功率的答案。我想知道
R
是如何精确显示结果的。我想问题是:数字可以显示多长时间(比如,5.555555555555E-5)和最精确的数字是什么,比如5e-320。我看到的是
R
,在创建了这么小的数字之后,似乎会进一步“忽略”它。你可能应该读一读浮点表示法。精度的位数和可以表示的数字的绝对大小之间存在差异…@BenBolker,就可以了。我想我在这个问题上有点含糊不清。我接受了第一个答案,因为它允许我比22位数更精确,但是我发现这个答案也非常有用。谢谢。我已经在上面的对话中添加了一条评论。。只是为了骗人
options(digits=22)
library("Rmpfr")

x <- c(7.831908e-70,6.002923e-26,6.372573e-36,5.025015e-38,5.603268e-38,1.118121e-14,  4.512098e-07,4.400717e-05,2.300423e-26,1.317602e-58)

sum(mpfr(x, 1024))

# 1 'mpfr' number of precision  1024   bits 
# [1] 4.445837981118120898327314579322617633703674840117902103769961398533293289165193843930280422747754618577451267010103975610356319174778512980120125435961577770470993217990999166176083700886405875414277348471907198346293122011042229843450802884152750493740313686430454254150390625000000000000000000000000000000000e-5