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:
- 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?
- Czy dotyczy
math.erf()
toscipy.stats.norm.cdf()
w szczególności Pythona lub SciPy ? Jak możesz powiedzieć? Ta strona
sin()
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óraMath.sin()
byłaby dokładna tylko w pewnych okolicznościach w JavaScript, jak wszędzie indziej?
źródło
Odpowiedzi:
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.
To uczciwa ocena. Dopuszczalne jest to, że dokumentacja stwierdza, że nie ma niespodzianek.
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.źródło