Heim > Backend-Entwicklung > C++ > Wann und wie sollte Double.Epsilon zum Vergleich von Gleitkommazahlen mit doppelter Genauigkeit verwendet werden?

Wann und wie sollte Double.Epsilon zum Vergleich von Gleitkommazahlen mit doppelter Genauigkeit verwendet werden?

DDD
Freigeben: 2025-01-05 17:04:43
Original
257 Leute haben es durchsucht

When and How Should Double.Epsilon Be Used for Comparing Double-Precision Floating-Point Numbers?

Double.Epsilon für Gleichheits- und Vergleichsoperationen

Die Double.Epsilon-Konstante enthält den kleinsten positiven Gleitkommawert Zahl, die als Doppel dargestellt werden kann, ohne auf Null zu runden. Es ist als Leitfaden für Gleitkommavergleiche gedacht, die Dokumentation kann jedoch verwirrend sein.

Kann Double.Epsilon für den direkten Vergleich verwendet werden?

Nein. Double.Epsilon definiert den kleinstmöglichen Kürzungsfehler. Dies bedeutet, dass sich Gleitkommazahlen bei der Durchführung mathematischer Operationen aufgrund von Rundungen um mehr als Double.Epsilon unterscheiden können. Daher spiegelt die Verwendung von Double.Epsilon für direkte Vergleiche die mathematische Gleichheit möglicherweise nicht genau wider.

Alternativen für genaue Vergleiche

Berücksichtigen Sie die folgenden Alternativen:

  • Einfache Epsilon-Berechnung: Für einfache Gleichheitsvergleiche können Sie verwenden ein kleines Epsilon basierend auf der Größe der verglichenen Werte. Zum Beispiel:
public static bool ApproximatelyEqual(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
  • Relative Toleranz: Verwenden Sie eine relative Toleranz, um Größenunterschiede zu berücksichtigen. Zum Beispiel:
public static bool ApproximatelyEqualRelative(double x, double y, double tolerance) {
    return Math.Abs(x - y) / Math.Max(Math.Abs(x), Math.Abs(y)) <= tolerance;
}
Nach dem Login kopieren

Implementierungen für andere Vergleichsoperationen

Um Größer-als- (>) und Kleiner-als-(<)-Vergleiche zu implementieren, invertieren die für die Gleichheit verwendete Logik:

  • Größer Als:

    public static bool GreaterThan(double x, double y) {
        return ApproximatelyEqualRelative(x - y, y, 1E-15) > 0;
    }
    Nach dem Login kopieren
  • Kleiner als:

    public static bool LessThan(double x, double y) {
        return ApproximatelyEqualRelative(x - y, y, 1E-15) < 0;
    }
    Nach dem Login kopieren

Für größer oder gleich (>=) und Kleiner-gleich-(<=)-Vergleiche, ändern Sie die obigen Implementierungen dementsprechend:

public static bool GreaterThanOrEqual(double x, double y) {
    return ApproximatelyEqualRelative(x - y, y, 1E-15) >= 0;
}

public static bool LessThanOrEqual(double x, double y) {
    return ApproximatelyEqualRelative(x - y, y, 1E-15) <= 0;
}
Nach dem Login kopieren

Denken Sie daran, dass es sich bei diesen Implementierungen nur um Näherungswerte handelt und diese mit Vorsicht in Situationen verwendet werden sollten, in denen genaue Vergleiche entscheidend sind.

Das obige ist der detaillierte Inhalt vonWann und wie sollte Double.Epsilon zum Vergleich von Gleitkommazahlen mit doppelter Genauigkeit verwendet werden?. 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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage