Implikowana precyzja funkcji zmiennoprzecinkowych

9

Przeglądając implementację funkcji innego programisty w celu obliczenia CDF o rozkładzie normalnym , zasugerowałem, aby albo zastąpić całą implementację wbudowanymi funkcjami Pythona, albo użyć SciPy, wspólnej biblioteki naukowej.

Inny programista zauważył, że ani math.erfc()nie scipy.stats.norm.cdf()zapewnia żadnych gwarancji dokładności w swojej dokumentacji. Dlatego powinienem być bardziej ostrożny przy zastępowaniu algorytmu aproksymacyjnego (który został wzięty z szanowanego źródła i który ma udokumentowane granice błędów ).

Szczerze mówiąc, myśl, by wątpić w dokładność i precyzję funkcji wbudowanej lub bibliotecznej, nigdy nie przyszła mi do głowy. Po tym wszystkim, byłem wywoływania funkcji jak sin()i sqrt()przez wiele lat bez zastanowienia - dlaczego powinien math.erf()albo scipy.stats.norm.cdf()być inna?

Ale teraz się martwię. Moje pytania to:

  1. Zasadniczo, jeśli w dokumentacji nie ma żadnej szczególnej wzmianki, oznacza to, że tego rodzaju funkcje są całkowicie dokładne z dokładnością do ostatniego miejsca po przecinku, w ramach precyzji oferowanej przez zmiennoprzecinkowy podwójnej precyzji IEEE?
  2. Czy dotyczy math.erf()to scipy.stats.norm.cdf()w szczególności Pythona lub SciPy ? Jak możesz powiedzieć?
  3. Ta stronasin() podręcznika dla mówi…

    Funkcje te mogą stracić dokładność, gdy ich argument jest bliski wielokrotności liczby pi lub jest daleki od 0,0.

    Dlaczego takie zastrzeżenia powinny istnieć, skoro funkcja sinusoidalna jest okresowa i symetryczna? Wydaje się, że na dzwoniącego spoczywa ciężar kanonizacji danych wejściowych w celu uzyskania optymalnej dokładności.

    Z drugiej strony dokumentacja Mozilli Math.sin()nie mówi nic o dokładności ani precyzji. Czy to oznacza, że ​​jest w pełni dokładny, czy też jest to „powszechna wiedza”, która Math.sin()byłaby dokładna tylko w pewnych okolicznościach w JavaScript, jak wszędzie indziej?

200_sukces
źródło
1
FYI w odniesieniu do pytania 1: Zazwyczaj gwarancje precyzji są podawane w kategoriach ULP (jednostki na ostatnim miejscu), które odnoszą się do cyfr binarnych liczby zmiennoprzecinkowej.

Odpowiedzi:

10

Jeśli w dokumentacji nie ma żadnej szczególnej wzmianki, oznacza to, że tego rodzaju funkcje są całkowicie dokładne do ostatniego miejsca po przecinku, w ramach precyzji oferowanej przez zmiennoprzecinkowy podwójnej precyzji IEEE?

Nie przyjąłbym tego założenia.

Kiedy pracuję, zajmujemy się danymi telemetrycznymi i powszechnie wiadomo, że dwie różne biblioteki matematyczne mogą dawać dwa różne wyniki, nawet jeśli oba są zgodne ze standardami zmiennoprzecinkowymi IEEE. Ma to wpływ na próbę powtórzenia obliczenia i porównania dwóch wyników w celu zapewnienia równości.

Wydaje się, że na dzwoniącego spoczywa ciężar kanonizacji danych wejściowych w celu uzyskania optymalnej dokładności.

To uczciwa ocena. Dopuszczalne jest to, że dokumentacja stwierdza, że nie ma niespodzianek.

Z drugiej strony dokumentacja Mozilli ...

Proponuję wypróbować kilka obliczeń w każdej bibliotece lub języku programowania (szczególnie w pobliżu obszarów granicznych, takich jak sin()wielokrotność pi) i porównać je. To powinno dać ci dobry pogląd na to, jakiego rodzaju zachowania możesz się spodziewać po każdym z nich.

Robert Harvey
źródło
2
Test to dobry pomysł. W niezliczonej liczbie przypadków dokumentacja mówi jedną rzecz, ale funkcje zachowują się w inny sposób. A OP chce polegać na domyślnych założeniach, które nawet nie są udokumentowane.
Siyuan Ren,