Problem
Gleitkomma kann nicht alle Dezimalwerte exakt speichern. Bei Verwendung von Gleitkommaformaten treten also immer Rundungsfehler bei den Eingabewerten auf. Die Fehler an den Eingängen führen natürlich zu Fehlern an der Ausgabe. Im Fall einer diskreten Funktion oder eines diskreten Operators kann es große Unterschiede in der Ausgabe um den Punkt geben, an dem die Funktion oder der Operator diskret ist.
Eingabe und Ausgabe für Gleitkommawerte
Wenn Sie Gleitkommavariablen verwenden, sollten Sie sich dessen immer bewusst sein. Und jede Ausgabe, die Sie von einer Berechnung mit Gleitkommawerten wünschen, sollte immer formatiert / konditioniert werden, bevor sie in diesem Sinne angezeigt wird.
Wenn nur kontinuierliche Funktionen und Operatoren verwendet werden, reicht es häufig aus, auf die gewünschte Genauigkeit zu runden (nicht abschneiden). Standardformatierungsfunktionen zum Konvertieren von Floats in Zeichenfolgen erledigen dies normalerweise für Sie.
Da durch die Rundung ein Fehler hinzugefügt wird, der dazu führen kann, dass der Gesamtfehler mehr als die Hälfte der gewünschten Genauigkeit beträgt, sollte die Ausgabe basierend auf der erwarteten Genauigkeit der Eingaben und der gewünschten Genauigkeit der Ausgabe korrigiert werden. Du solltest
- Runden Sie Eingaben auf die erwartete Genauigkeit oder stellen Sie sicher, dass keine Werte mit höherer Genauigkeit eingegeben werden können.
- Fügen Sie den Ausgaben vor dem Runden / Formatieren einen kleinen Wert hinzu, der kleiner oder gleich 1/4 der gewünschten Genauigkeit und größer als der maximal erwartete Fehler ist, der durch Rundungsfehler bei der Eingabe und während der Berechnung verursacht wird. Ist dies nicht möglich, reicht die Kombination der Genauigkeit des verwendeten Datentyps nicht aus, um die gewünschte Ausgabegenauigkeit für Ihre Berechnung zu erzielen.
Diese beiden Dinge werden normalerweise nicht erledigt und in den meisten Fällen sind die Unterschiede, die dadurch verursacht werden, dass sie nicht ausgeführt werden, zu gering, um für die meisten Benutzer wichtig zu sein. Ich hatte jedoch bereits ein Projekt, bei dem die Ausgabe von den Benutzern ohne diese Korrekturen nicht akzeptiert wurde.
Diskrete Funktionen oder Operatoren (wie Modul)
Wenn diskrete Operatoren oder Funktionen beteiligt sind, sind möglicherweise zusätzliche Korrekturen erforderlich, um sicherzustellen, dass die Ausgabe wie erwartet ist. Das Runden und Hinzufügen kleiner Korrekturen vor dem Runden kann das Problem nicht lösen.
Möglicherweise ist eine spezielle Überprüfung / Korrektur der Zwischenberechnungsergebnisse unmittelbar nach Anwendung der diskreten Funktion oder des Operators erforderlich. Für einen bestimmten Fall (Moduloperator) siehe meine Antwort auf die Frage: Warum gibt der Moduloperator eine Bruchzahl in Javascript zurück?
Vermeiden Sie besser das Problem
Es ist oft effizienter, diese Probleme zu vermeiden, indem für solche Berechnungen Datentypen (Ganzzahl- oder Festkommaformate) verwendet werden, mit denen die erwartete Eingabe ohne Rundungsfehler gespeichert werden kann. Ein Beispiel dafür ist, dass Sie niemals Gleitkommawerte für Finanzberechnungen verwenden sollten.
0.1
, eine endliche binäre Gleitkommazahl abzubilden .