Implizite Genauigkeit von Gleitkommafunktionen

9

Während eines anderen Programmierers Überprüfung Implementierung einer Funktion der Normalverteilung CDF zu berechnen , habe ich einen Vorschlag , um entweder die gesamte Implementierung mit Python eingebauten Funktionen oder verwenden SciPy, eine gemeinsame wissenschaftliche Bibliothek ersetzen.

Ein anderer Programmierer wies darauf hin , dass weder math.erfc()noch scipy.stats.norm.cdf()bietet keine Präzision garantiert in ihrer Dokumentation. Daher sollte ich beim Ersetzen eines Approximationsalgorithmus (der aus einer angesehenen Quelle stammt und Fehlergrenzen dokumentiert hat ) vorsichtiger sein .

Um ehrlich zu sein, war mir der Gedanke, an der Genauigkeit und Präzision einer eingebauten oder Bibliotheksfunktion zu zweifeln, nie in den Sinn gekommen. Immerhin habe ich Funktionen wie sin()und sqrt()seit Jahren ohne viel Nachdenken aufgerufen - warum sollte math.erf()oder scipy.stats.norm.cdf()sollte es anders sein?

Aber jetzt mache ich mir Sorgen. Meine Fragen sind:

  1. Wenn in der Dokumentation keine besondere Erwähnung gefunden wird, bedeutet dies im Allgemeinen, dass diese Art von Funktionen innerhalb der vom IEEE-Gleitkomma mit doppelter Genauigkeit gebotenen Genauigkeit bis zur letzten Dezimalstelle vollständig genau sind?
  2. Gilt das insbesondere für Pythons math.erf()oder SciPys scipy.stats.norm.cdf()? Woran erkennst du das?
  3. Diese Manpage fürsin() sagt ...

    Diese Funktionen können an Genauigkeit verlieren, wenn ihr Argument nahe einem Vielfachen von pi liegt oder weit von 0,0 entfernt ist.

    Warum sollten solche Vorbehalte bestehen, wenn die Sinusfunktion periodisch und symmetrisch ist? Es scheint eine Belastung für den Anrufer zu sein, die Eingabe zu kanonisieren, um eine optimale Genauigkeit zu erzielen.

    Andererseits Math.sin()sagt die Dokumentation von Mozilla nichts über Genauigkeit oder Präzision aus. Bedeutet das, dass es vollständig korrekt ist, oder ist es "allgemein bekannt", dass Math.sin()es unter bestimmten Umständen in JavaScript nur genau ist, wie überall sonst?

200_Erfolg
quelle
1
Zu Ihrer Information in Bezug auf Frage 1: In der Regel Präzision garantiert werden in Form von ULP (Einheiten in dem letzten Platz) gegeben , die auf dem bezieht sich binären Ziffern des Schwimmers.

Antworten:

10

Wenn in der Dokumentation keine besondere Erwähnung gefunden wird, bedeutet dies, dass diese Art von Funktionen innerhalb der vom IEEE-Gleitkomma mit doppelter Genauigkeit gebotenen Genauigkeit bis zur letzten Dezimalstelle vollständig genau sind?

Ich würde diese Annahme nicht machen.

Bei meiner Arbeit beschäftigen wir uns mit Telemetriedaten, und es ist allgemein bekannt, dass zwei verschiedene Mathematikbibliotheken zwei unterschiedliche Ergebnisse liefern können, selbst wenn beide den IEEE-Gleitkomma-Standards entsprechen. Dies hat Auswirkungen, wenn Sie versuchen, eine Berechnung zu wiederholen und zwei Ergebnisse auf Gleichheit zu vergleichen.

Es scheint eine Belastung für den Anrufer zu sein, die Eingabe zu kanonisieren, um eine optimale Genauigkeit zu erzielen.

Das ist eine faire Einschätzung. Was es akzeptabel macht, ist, dass die Dokumentation dies angibt, so dass es keine Überraschungen gibt.

Auf der anderen Seite Mozillas Dokumentation ...

Ich schlage vor, dass Sie einige Berechnungen in jeder Bibliothek oder Programmiersprache versuchen (insbesondere in der Nähe der Grenzbereiche wie in der sin()Nähe eines Vielfachen von pi) und diese vergleichen. Dies sollte Ihnen eine gute Vorstellung davon geben, welche Art von Verhalten Sie von jedem einzelnen erwarten können.

Robert Harvey
quelle
2
Test ist eine gute Idee. Es gibt unzählige Male, in denen die Dokumentation eines sagt, die Funktionen sich jedoch anders verhalten. Und OP möchte sich auf implizite Annahmen stützen, die nicht einmal dokumentiert sind.
Siyuan Ren