ほとんどの数学ライブラリには、対数関数の多数のバージョンがあります。ほとんどの場合、それらは完璧であると仮定しますが、実際にはかなりの数の精度が一定の桁数で提供されています。
一部の関数には、数値的に安定したバリアントがあります。たとえば、Fortran、R、Java、Cの両方にはMath.log1p
、計算用にlog(1.0+x)
(xの小さな値に対してより高い精度を提供する)と、対応するがありexpm1
ます。ここで、数値の問題は精度の低下から発生します- x
本当に小さい場合1.0 + x
、先頭の1を保持するために桁が失われます。
私は、多くの状況で精度を高めるためのそのような関数を見てきました。これは、高い数値精度で分布関数(ガンマ、ベータ、ポアソンなど)を実装する場合によくあるようです。たとえば、ガンマ関数はほとんどの場合、として使用されlogGamma
ます。一般に、「ログスペース」に移動すると精度が大幅に向上する可能性があるため、ほとんどの関数にはRに「ログスペース」フラグが設定されているようです。
別の例では、Rは、存在log1mexp
のためにlog(1 - exp(p))
:
http://cran.r-project.org/web/packages/Rmpfr/vignettes/log1mexp-note.pdf
エントロピーと情報理論的手段で遊んでいます。非常に一般的な用語があります
p * -log(p)
通常、対数の底はeではなく2になります。しかし、これは多くの場合、これは線形要因に過ぎず、自然対数も使用できます(したがって、これは私にとって重要ではありません)。とにかく、この用語をより速く/より直接的に/より正確に計算する方法があるかどうか知っていますか?私はあちこちでそれを持っているので、それをもう少し正確かつ高速にするために本当に成果を上げることができます(通常の「時期尚早な最適化」のものをありがとう、ありがとう)。
精度の低下を引き起こす明白な理由は見当たりません。そのため、この計算を高速化するための素晴らしいトリックがあるかどうかに主に興味があります。それはおそらく私がp=0
コーナーケースを処理することを節約することもあります(これは存在し0
ますlog(0)
が、存在しませんが)、ベース2を無料で提供します(ただし、定数との単一の乗算は明らかに高価ではありません)。ありがとう。
log2
お使いのOSに応じて、log/log(2)
C99がlog2
関数を追加したという事実の単純なラッパーまたは利用できる関数が付属しています。