Próbuję zaimplementować następującą funkcję w zmiennoprzecinkowym podwójnej precyzji z niskim błędem względnym :
Jest to szeroko stosowane w aplikacjach statystycznych w celu dodania prawdopodobieństw lub gęstości prawdopodobieństwa, które są reprezentowane w przestrzeni dziennika. Oczywiście albo albo mogą łatwo przepełnić lub niedopełnić, co byłoby złe, ponieważ przestrzeń dziennika jest używana przede wszystkim do uniknięcia niedopełnienia. To typowe rozwiązanie:
Anulowanie z ma miejsce, ale jest złagodzone przez . Zdecydowanie gorsze jest, gdy i są blisko. Oto wykres błędu względnego:
Wykres jest odcięty w podkreślać kształt krzywej l o, g y U m ( x , y ) = 0 , o których występuje odwołanie. Widziałem błędu do 10 - 11 i podejrzewa, że robi się znacznie gorzej. (FWIW, funkcja „prawdy gruntu” jest implementowana za pomocą pływaków MPFR o dowolnej dokładności z 128-bitową precyzją).
Próbowałem innych przeformułowań, wszystkie z tym samym rezultatem. Przy jako zewnętrzna ekspresji sam błąd występuje poprzez rejestr coś w pobliżu 1. Z l O g 1 s , co zewnętrzna ekspresji, odwołanie się dzieje w wewnętrznej ekspresji.
Teraz absolutnym błędu jest bardzo mały, więc jest bardzo mały błąd względny (szerokość epsilon). Można argumentować, że ponieważ użytkownik l o g s u m jest naprawdę zainteresowany prawdopodobieństwa (prawdopodobieństw nie log), to straszny błąd względny nie jest problemem. Prawdopodobnie zwykle tak nie jest, ale piszę funkcję biblioteczną i chciałbym, aby jej klienci mogli liczyć na błąd względny niewiele gorszy niż błąd zaokrąglania.
Wygląda na to, że potrzebuję nowego podejścia. Co to może być
źródło
Odpowiedzi:
Formuła powinna być stabilna numerycznie. Uogólnia się na obliczenie stabilne numerycznie log ∑ i e x i = ξ + log ∑ i e x i
W przypadku, gdy suma logarytmiczna jest bardzo bliska zeru i chcesz wysokiej dokładności względnej, prawdopodobnie możesz użyć przy użyciu dokładna (tj. ponad dwukrotna precyzja) implementacja l e x p ( z ) : = log ( 1 + e - | z |
źródło