Mein naiver Eindruck ist, dass man den Unterschied immer gegen ein Toleranz-Epsilon testen würde. Liege ich falsch? Kann es in bestimmten Kontexten sinnvoll sein, die Gleichheit von Floats zu testen?
Es gibt keine einzigartigen Rezepte. In diesem Artikel finden Sie eine ausführliche Beschreibung, in der Sie eine vollständige Antwort mit technischen Informationen und Code finden.
Zusammenfassend gibt es hauptsächlich 3 Fälle:
- Vergleich gegen Null
- Vergleich mit einer Nicht-Null
- Vergleichen von zwei beliebigen Zahlen
Ihre Idee, einen Vergleich mit einer Toleranz durchzuführen, ist in einigen Fällen gut, aber es gibt auch eine Technik, die auf der Einheit an letzter Stelle ( ULP ) basiert und im Artikel beschrieben wird
Ich gehe implizit davon aus, dass die Verwendung des Gleichheitsoperators für Floats in einigen Kontexten tatsächlich sinnvoll ist. Warum sollten die meisten Programmiersprachen dies sonst zulassen?
Wie oben gibt es Situationen, in denen Sie es verwenden können, aber seien Sie gewarnt. Zum Beispiel hat der gcc-Compiler eine Warnung:
warning: comparing floating point with == or != is unsafe
Aktualisieren
Ich füge einige Überlegungen über diesem Argument hinzu, auch sie sind nicht eng mit dem Fall verbunden a == b
.
Gleichheit mit Ausdruck
Betrachtet man den Fall:
a + b == c
a b c
a ⊕ bfl ( fl (a)+ fl (b))= = c= = fl (c)
∣∣∣eina + b∣∣∣e r rein+ ∣∣∣ba + b∣∣∣e r rb
e r rx= | x - fl (x)|| x |
In diesem Fall ist die Verwendung ==
also heikler.
Portierung in verschiedenen Umgebungen
Wenn wir einen Code in verschiedenen Umgebungen (verschiedenen Maschinen) portieren, können wir unterschiedliche Ergebnisse erzielen (versuchen Sie beispielsweise, an einen Komponententest zu denken). Auch in dem Fall ist die Verwendung von ==
empfindlich.