2012-03-28 10 views
7

<math.h>double秒間log(1+x)を計算するためのより正確な方法を提供します。log(1-x)は?log1pとなるため、log(1 + x)はlog1pになります。

log(1-x)を計算するための同様に正確な方法はありますか?

私は(私は主に掛けるとゼロに非常に近い数字を合計しています)より高い精度のログ・スペースでいくつかの作業をやろうとしているので、私が尋ねる理由があります。 log1pを使ってlog(exp(log_of_a) + exp(log_of_b)) = log(a + b)という関数を書くのが簡単だとわかりました。私はその違いのために同様の機能を作ろうとしています:

log(exp(log_of_a) - exp(log_of_b)) = log(a - b) ここでは、もちろんa > bです。

基本的に、限りlog_aまたはlog_b== -infもないとして、関数は単純に返す必要があります:私のlog_add機能で

return log(1 - exp(log_b-log_a)) + log_a; 

を、私はlog(1 + ...)で終わる、と私はlog1pを使用しています。しかしここに私はlog(1 - ...)を持っています。念のため、私もlog1mをグーグルが、引数xが範囲[-inf, 1)である

ときに運...、私は単純に(私の主張a > b与えられた)log1p(-x)を使用することができませんでした。

は、これを解決について移動すること最善の方法ですか?私は本当に私ができる最も正確な結果を取得する方法を知っているあなたの助けをいただければと思います前に行われている作業...

をやって(または私はこれ以上の結果は、より正確に得ることができない理由を説明しなければならないと感じ)。

+1

は - 右、'ログ(B)=?あなたは 'a + b'を持っています。 – Gabe

+0

+1おっと!良いキャッチ。遅いです... – user

+11

浮動小数点数の否定は正確です。したがって、 'log1p(-x)'は 'log1p(x)'と同じくらい正確です。 –

答えて

10

@Raymond Chenは「浮動小数点数の否定は正確であるため、log1p(-x)log1p(x)と同じくらい正確です。」本当の答えにするだけです。私はあなたが `ログ(EXP(log_of_a) - EXP(log_of_b))を意味すると仮定し

+0

だから私はこれを考えすぎた... – user

+2

log1p(-x)は実際にそれを行ううまい方法ですが、この答えは、正確なステートメントを作成しているように聞こえるが、実際にはそうではないと誤解を招くと思います。もしあなたがそうだと思うならば、「正確である」ということを正確に言ってから、「浮動小数点数の否定は正確です」から「log1p(-x)はlog1p(x)と同じです。 。 –