在R中表示非常大的数字

时间:2013-02-04 17:06:44

标签: r logarithm exponential

我有很大值的对数,例如:

log_a = 1347 
log_b = 1351 

我正试图解决这个问题:

exp(log_a) - (0.1 * exp(log_b))

或者相当于此(相同的表达只是以不同的形式):

exp( log_a ) - exp( log(0.1) + log_b ) 

但当然每次我尝试计算exp(log_a)或exp(log_b) 价值我得到了Inf。我可以使用任何技巧来获得真实的结果 对于exp(log_a) - (0.1 * exp(log_b)),以对数或 指数形式?

非常感谢您的帮助!

3 个答案:

答案 0 :(得分:9)

library(Brobdingnag)
a <- as.brob(exp(1))^1347
a*(1-0.1*exp(4))
#[1] -exp(1348.5)

或手动计算:

-(exp(1347+log(0.1*exp(4)-1))=-exp(1347+1.4951...)=-exp(1348.4951...)

答案 1 :(得分:4)

X = exp(log_a) - (0.1 * exp(log_b))
  = exp(log_a) * (1 - 0.1 * exp(log_b) / exp(log_b))
  = exp(log_a) * (1 - exp(-log(10) + log_b - log_a))
  = -exp(log_a) * expm1(-log(10) + log_b - log_a)

expm1是一个内置函数,可以准确计算exp(x)-1的{​​{1}}接近零。只有当x的参数为负时,才能得到对数的对数,以便整个表达式为正。然后你可以取绝对值的对数。

expm1

答案 2 :(得分:1)

您可以将gmp库用于R,它支持大数(据我所知,任意大)

例如

> bigz('11111111111111111111111111111111111111111111111111111111111111111111111111111')
Big Integer ('bigz') :
[1] 11111111111111111111111111111111111111111111111111111111111111111111111111111

我假设指数运算符包含在包中的某个位置。手册在这里:http://cran.r-project.org/web/packages/gmp/gmp.pdf