我在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
选择这种奇怪的自动行为?也许它不是真的这样做,我只是看到截断形式的结果?在这种情况下,变量中存储的实际精度是否正确?
答案 0 :(得分: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
答案 1 :(得分: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
您可以在?print.default
您还可以设置一个选项 - 这会影响对print
options(digits=22)
答案 2 :(得分:0)
您听说过浮点数吗?
只要结果保持在之间,就不会损失乘法或除法的精度(有效数字)
1.7976931348623157·10^308 to 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位)
而不是像整数一样使用直接转换(它们代表from ~ -2^62 to +2^62
,每个INTEGER数字->大约from -10^16 to +10*16
)
还是存在像浮点这样的聪明方法?来自1.7976931348623157·10^308 to - 4.9·10^−324
,它可以表示/近似有理数?
因此,在浮点数中,要达到更大的范围,必须牺牲求和的精度,在求和或减法过程中会损失精度,因为有效数字可能由(a的)小数部分(的52位)表示。 64位浮点数)小于log10(2^52) ~ 16
。
如果您正在寻找基本的日常示例summary(lm),则当参数的p值接近零时,summary()会输出<2.2e-16(巧合)。
为什么限制为64位? CPU具有专门用于64位浮点算术(64位IEEE 754标准)的执行单元,如果您使用更高的精度(例如128位浮点),则性能将降低10倍或更多,因为CPU需要拆分数据并进行运算可以处理多个64位数据和操作。
https://en.wikipedia.org/wiki/Double-precision_floating-point_format