Heim > Backend-Entwicklung > C++ > Sollte ich Double.Epsilon für Gleitkommavergleiche verwenden?

Sollte ich Double.Epsilon für Gleitkommavergleiche verwenden?

Linda Hamilton
Freigeben: 2025-01-05 04:58:42
Original
489 Leute haben es durchsucht

Should I Use Double.Epsilon for Floating-Point Comparisons?

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;
}
Nach dem Login kopieren

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:

  • Größer als: x > y && !AboutEqual(x, y)
  • Kleiner als: x < y && !AboutEqual(x, y)
  • Kleiner oder gleich: AboutEqual(x, y) || x < y
  • Größer als oder gleich: AboutEqual(x, y) || x > y
  • 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!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage