我正在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选择这么奇怪的自动行为?也许它不是真的这样做,我只是看到截断形式的结果?在这种情况下,变量中存储的实际精度是否正确?
您的总和没有精确损失.但是如果你担心它,你应该使用多精度库:
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)
您的结果仅在显示中截断.
尝试:
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)
| 归档时间: |
|
| 查看次数: |
3318 次 |
| 最近记录: |