Die meisten Mathematikbibliotheken verfügen über eine Reihe von Versionen von Logarithmusfunktionen. Die meiste Zeit gehen wir davon aus, dass sie perfekt sind, aber tatsächlich bieten ziemlich viele von ihnen nur eine bestimmte Anzahl von Stellen mit Präzision.
Für einige Funktionen gibt es numerisch stabilere Varianten. Zum Beispiel haben Fortran, R, Java und C beide Math.log1p
für die Berechnung log(1.0+x)
(die eine höhere Genauigkeit für kleine Werte von x bietet) und das Gegenstück expm1
. Hier ergeben sich die numerischen Probleme aus einem Genauigkeitsverlust - wenn er x
wirklich klein ist, 1.0 + x
verliert er Ziffern, um die 1 am Anfang beizubehalten.
Ich habe solche Funktionen für eine höhere Präzision in einer Reihe von Situationen gesehen. Dies scheint häufig vorzukommen, wenn Sie Verteilungsfunktionen (Gamma, Beta, Poisson usw.) mit hoher numerischer Genauigkeit implementieren. Zum Beispiel scheint die Gamma-Funktion die meiste Zeit als verwendet zu werden logGamma
. Im Allgemeinen kann das Aufrufen von "Logspace" die Genauigkeit erheblich verbessern, und daher scheint R bei den meisten Funktionen ein "Logspace" -Flag zu haben.
Ein weiteres Beispiel in R gibt es log1mexp
für log(1 - exp(p))
:
http://cran.r-project.org/web/packages/Rmpfr/vignettes/log1mexp-note.pdf
Ich habe mit entropie- und informationstheoretischen Maßnahmen herumgespielt. Ein sehr häufiger Begriff gibt es
p * -log(p)
wo normalerweise möchte man, dass die Basis des Logarithmus 2 ist, nicht e; aber genauso oft ist dies nur ein linearer Faktor, und Sie können auch den natürlichen Logarithmus verwenden (daher ist dies für mich nicht von zentraler Bedeutung). Wie auch immer, wissen Sie, ob es eine schnellere / direktere / präzisere Methode gibt, diesen Begriff zu berechnen? Ich habe es überall, also könnte es sich wirklich auszahlen, es ein bisschen präziser und schneller zu machen (ersparen Sie mir das übliche Zeug zur "vorzeitigen Optimierung", danke).
Ich sehe keinen offensichtlichen Grund, der zu einem Präzisionsverlust führen würde. Ich bin also hauptsächlich daran interessiert, ob es einen netten Trick gibt, um diese Berechnung zu beschleunigen. Das erspart mir vielleicht sogar die Behandlung des p=0
Eckfalls (was sinnvoll ist 0
, obwohl es log(0)
ihn nicht gibt) oder gibt mir Basis 2 kostenlos (obwohl eine einzelne Multiplikation mit einer Konstanten offensichtlich nicht mörderisch teuer ist). Vielen Dank.
log2
Funktion geliefert, die je nach Betriebssystem ein einfacher Wrapper sein log/log(2)
oder die Tatsache nutzen kann, dass C99 eine log2
Funktion hinzugefügt hat .