数学的に言えば、これらの数字の 1 つが appx になります。ゼロ、そしてもう一つ。あなたの数字の違いは大きいので、これが理にかなっているのかどうかさえ疑問に思っています.
logspace_add
しかし、一般的にそれを行うには、R のフードの下にある C 関数のアイデアを使用できます。 logxpy ( =log(x+y) )
whenlx = log(x)
およびly = log(y)
asを定義できます。
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
。本当にもっと精度が必要で、プラットフォームが long double 型をサポートしている場合は、すべてを C や C++ などでコーディングし、後で結果を返すことができます。しかし、私が正しければ、R は - 今のところ - 通常の double しか扱えないので、最終的には結果が表示されたときに再び精度を失うことになります。
編集 :
あなたのために計算をする:
log(x+y) = log(exp(lx)+exp(ly))
= log( exp(lx) * (1 + exp(ly-lx) )
= lx + log ( 1 + exp(ly - lx) )
ここで、最大のものを lx として、式 in に到達しlogxpy()
ます。
EDIT 2:なぜ最大を取るのですか?exp(lx-ly) で負の数を使用することを確認するのは簡単です。lx-ly が大きくなりすぎると、exp(lx-ly) は Inf を返します。それは正しい結果ではありません。exp(ly-lx) は 0 を返すため、はるかに優れた結果が得られます。
lx=1 と ly=1000 とすると、次のようになります。
> 1+log1p(exp(1000-1))
[1] Inf
> 1000+log1p(exp(1-1000))
[1] 1000