Double.Epsilon in Gleitkommavergleichen
Frage:
Die MSDN-Dokumentation für Double.Epsilon gibt an, dass es nicht zur Bestimmung der Gleichheit zwischen Gleitkommazahlen verwendet werden sollte. Einige Quellen empfehlen jedoch, es für Vergleiche zu verwenden. Ist es möglich, Double.Epsilon für Gleichheits- und andere Vergleiche zu verwenden, z. B. größer als und kleiner als?
Antwort:
Der Epsilon-Wert stellt das kleinste darstellbare Nicht dar -denormaler Gleitkommawert ungleich 0. Obwohl es in Vergleichen wie ein natürlicher Kandidat für Epsilon erscheinen mag, ist es dafür nicht präzise genug Zweck.
Double.Epsilon spiegelt den kleinsten darstellbaren Kürzungsfehler wider, der jedoch je nach Größe der verglichenen Zahlen stark variiert. Für zwei Zahlen nahe 1 könnte Double.Epsilon beispielsweise 0,0000000000000002220446 sein, während es für zwei Zahlen nahe 1.000.000.000.000.000 222.044.604.925.093.800 sein könnte. Das bedeutet, dass das Verlassen auf Double.Epsilon für Gleichheits- oder andere Vergleiche keine konsistenten Ergebnisse liefern würde.
Alternative Epsilon-Schätzung für Gleichheit:
Ein empfohlener Ansatz für den Vergleich von Floating- Punktwerte für Gleichheit ist die Verwendung eines Epsilons der Konstante * 1E-15. Dies bedeutet ungefähr, dass der Double-Typ Werte mit einer Genauigkeit von 15 Stellen darstellen kann. Zum Beispiel:
public static bool AboutEqual(double x, double y) { double epsilon = Math.Max(Math.Abs(x), Math.Abs(y)) * 1E-15; return Math.Abs(x - y) <= epsilon; }
Vergleichsoperatoren:
Während Double.Epsilon nicht direkt für Vergleiche verwendet werden kann, kann die AboutEqual-Methode für größer als und kleiner als angepasst werden , kleiner oder gleich und größer oder gleich:
Zusätzliche Überlegungen:
Es ist wichtig zu beachten, dass sich Kürzungsfehler anhäufen können, insbesondere beim Umgang mit berechneten Werten. Daher müssen Sie möglicherweise den Epsilon-Wert entsprechend anpassen, um eine angemessene Präzision zu erreichen.
Das obige ist der detaillierte Inhalt vonSollte ich Double.Epsilon für Gleitkommavergleiche verwenden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!