计算R中的精度等级

zim*_*ima 2 precision r

我正在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
Run Code Online (Sandbox Code Playgroud)

从示例中可以看出,此计算的基础是1e-5,它以非常粗鲁的方式舍入敏感计算.

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

Fer*_*aft 6

您的总和没有精确损失.但是如果你担心它,你应该使用多精度库:

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
Run Code Online (Sandbox Code Playgroud)


And*_*rie 5

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

尝试:

x <- 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))

print(x, digits=22)
[1] 4.445837981118121081878e-05
Run Code Online (Sandbox Code Playgroud)

您可以阅读有关打印行为的更多信息 ?print.default


您还可以设置一个选项 - 这将影响所有来电 print

options(digits=22)
Run Code Online (Sandbox Code Playgroud)