有没有一种方法可以处理涉及R中大值的指数的计算?

时间:2020-03-24 17:08:04

标签: r precision numeric

我在网站上和网站上都看了一些,但没有找到任何解决方案。我的问题相对简单,因此,如果您能为我指出一个可能的解决方案,将不胜感激。

test_vec <- c(2,8,709,600)
mean(exp(test_vec))

test_vec_bis <- c(2,8,710,600)
mean(exp(test_vec_bis))
exp(709)
exp(710)
# The numerical limit of R is at exp(709)

我如何计算我的向量的平均值并处理Inf值,而我知道R可以处理平均值但不是平均值计算分子中的所有值?

2 个答案:

答案 0 :(得分:1)

在一个极端的情况下,您可以通过数学上简单地重新求解问题来解决问题,但这将需要向量的长度非常大和/或您的exp很大。数字接近数字限制:

由于均值sum(x)/n可以写成sum(x/n),并且自exp(x)/exp(y) = exp(x-y)起,您就可以计算sum(exp(x-log(n))),这使log(n)减轻了。

mean(exp(test_vec))
[1] 2.054602e+307
sum(exp(test_vec - log(length(test_vec))))
[1] 2.054602e+307

sum(exp(test_vec_bis - log(length(test_vec_bis))))
[1] 5.584987e+307

虽然这适用于您的示例,但很可能不适用于您的真实矢量。 在这种情况下,您将必须咨询@fra建议的Rmpfr之类的软件包。

答案 1 :(得分:0)

在这里,您有资格只选择test_vec中给出答案的那些人<Inf

mean(exp(test_vec)[which(exp(test_vec) < Inf)])

[1] 1.257673e+260

t2 <- c(2,8,600)
mean(exp(t2))

[1] 1.257673e+260

这假定您正在寻找排除会导致Inf的值。