2013-02-04 46 views
1

我有非常大的值的對數,例如:Exponentiate非常大的數字中的R

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))得到一個真實結果 ,以對數還是 指數形式?

非常感謝您的幫助!

+0

exp(1351)= exp(1347)* exp(4)。因此,exp(1347) - (0.1 * exp(1351))= exp(1347)*(1-0.1 * exp(4))。該數字的絕對值太大,無法由R處理。爲什麼你需要這個? – Roland

+0

嗨,羅蘭,謝謝你。那麼有可能得到結果的自然記錄呢? – user971102

+0

結果是否定的...... – Roland

回答

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

您可以使用R,它支持大量的(任意大,因爲據我所知)

例如GMP庫

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

我認爲指數運算符包含在包中的某處。該手冊是在這裏:http://cran.r-project.org/web/packages/gmp/gmp.pdf

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)-1x接近於零。只有當expm1的參數爲負數時,您才能得到這個對數,這樣整個表達式纔是正數。然後你可以取絕對值的對數。

log X = log_a + log(-expm1(-log(10) + log_b - log_a))