數學上說,這些數字的人會APPX。零,另一個。你的數字之間的差異是巨大的,所以我甚至想知道這是否有道理。
但要做到這在一般情況下,你可以使用來自logspace_add
C函數這是R.之一引擎蓋下方的想法可以定義logxpy (=log(x+y))
當lx = log(x)
和ly = log(y)
爲:
logxpy <- function(lx,ly) max(lx,ly) + log1p(exp(-abs(lx-ly)))
這意味着我們可以使用:
> la1 <- 1000*log(0.1)
> la2 <- 1200*log(0.2)
> exp(la1 - logxpy(la1,la2))
[1] 5.807714e-162
> exp(la2 - logxpy(la1,la2))
[1] 1
這個功能可以遞歸調用,以及如果你有更多的數字。請注意,1仍然是1,而不是1減去5.807...e-162
。如果您確實需要更高的精度並且您的平臺支持長雙精度類型,那麼您可以用C或C++編碼所有內容,並稍後返回結果。但是如果我是對的,R可以 - 目前只能處理正常的雙打,所以最終當結果顯示時你會再次失去精度。
編輯:
做數學題給你:
log(x+y) = log(exp(lx)+exp(ly))
= log(exp(lx) * (1 + exp(ly-lx))
= lx + log (1 + exp(ly - lx) )
現在,你把最大的爲LX,然後你在logxpy()
來的表情。
編輯2:爲什麼採取最大呢?很簡單,以確保您在exp(lx-ly)中使用負數。如果lx-ly變得太大,那麼exp(lx-ly)會返回Inf。這不是一個正確的結果。 EXP(LY-60)將返回0,允許一個更好的結果:
說LX = 1和LY = 1000,則:
> 1+log1p(exp(1000-1))
[1] Inf
> 1000+log1p(exp(1-1000))
[1] 1000
鑑於你正在做一個部門,你可以先用數字分解手數嗎? – James 2011-04-27 10:33:17