计算R中的精度等级

时间:2013-09-11 13:44:53

标签: 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.317602e-58))
    [1] 4.445838e-05

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

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

3 个答案:

答案 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

相关问题