1

我有非常大的值的对数,例如:

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)) 的真实结果?

非常感谢你的帮助!

4

3 回答 3

10
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...)
于 2013-02-04T17:28:52.237 回答
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接近于x零的值。只有当参数为负时,您才能获得 this 的对数,expm1从而整个表达式为正。然后你可以只取绝对值的对数。

log X = log_a + log(-expm1(-log(10) + log_b - log_a))
于 2013-02-04T17:45:24.660 回答
1

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

例如

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

我认为幂运算符包含在包中的某处。手册在这里:http ://cran.r-project.org/web/packages/gmp/gmp.pdf

于 2013-02-04T17:29:45.230 回答