Ich versuche, die folgende Funktion in Gleitkommazahlen mit doppelter Genauigkeit und geringem relativen Fehler zu implementieren :
Dies wird in statistischen Anwendungen häufig verwendet, um Wahrscheinlichkeiten oder Wahrscheinlichkeitsdichten hinzuzufügen, die im Protokollbereich dargestellt werden. Natürlich könnte entweder oder leicht überlaufen oder unterlaufen, was schlecht wäre, da der Protokollspeicherplatz verwendet wird, um einen Unterlauf an erster Stelle zu vermeiden. Dies ist die typische Lösung:exp ( y )
Die Stornierung von erfolgt, wird jedoch durch gemildert . Bei weitem schlimmer ist es, wenn und nahe beieinander liegen. Hier ist eine relative Fehlerdarstellung:exp x l o g 1 p ( exp ( y - x ) )
Die Darstellung wird bei abgeschnitten , um die Form der Kurve , um die die Aufhebung auftritt. Ich habe Fehler bis zu und den Verdacht, dass es noch viel schlimmer wird. (FWIW, die "Ground Truth" -Funktion wird unter Verwendung von Gleitkommazahlen mit willkürlicher Genauigkeit und 128-Bit-Genauigkeit von MPFR implementiert.) l o g s u m ( x , y ) = 0 10 - 11
Ich habe andere Formulierungen ausprobiert, alle mit dem gleichen Ergebnis. Mit als äußerem Ausdruck tritt der gleiche Fehler auf, wenn ein Protokoll von 1 erstellt wird. Mit als äußerem Ausdruck wird der innere Ausdruck .l o g 1 p
Der absolute Fehler ist sehr klein, daher hat einen sehr kleinen relativen Fehler (innerhalb eines Epsilons). Man könnte argumentieren, dass dieser schreckliche relative Fehler kein Problem ist , da ein Benutzer von wirklich an Wahrscheinlichkeiten (nicht Log-Wahrscheinlichkeiten) interessiert ist. Es ist wahrscheinlich, dass dies normalerweise nicht der Fall ist, aber ich schreibe eine Bibliotheksfunktion, und ich möchte, dass die Clients auf relative Fehler zählen können, die nicht viel schlimmer sind als Rundungsfehler.l o g s u m
Es scheint, ich brauche einen neuen Ansatz. Was könnte es sein?
quelle
Antworten:
Wenn die Logsumme sehr nahe bei Null liegt und Sie eine hohe relative Genauigkeit wünschen, können Sie wahrscheinlich mit einer Genauigkeit verwenden (dh mehr als doppelte Genauigkeit) Implementierung von die für kleine nahezu linear ist .L e x p ( z ) : = log ( 1 + e - | z | ) z
quelle