Heim > Backend-Entwicklung > C++ > Wie sollte Double.Epsilon für genaue Gleitkommavergleiche verwendet werden?

Wie sollte Double.Epsilon für genaue Gleitkommavergleiche verwendet werden?

Patricia Arquette
Freigeben: 2025-01-06 03:28:43
Original
872 Leute haben es durchsucht

How Should Double.Epsilon Be Used for Accurate Floating-Point Comparisons?

Double.Epsilon für Float- und Double-Vergleiche

Frage:

Die MSDN-Dokumentation für System.Double.Epsilon besagt dass es nicht als Differenzspanne zur Bestimmung der Gleichheit verwendet werden sollte. Wie sollte Double.Epsilon für Gleitkommavergleiche verwendet werden?

Antwort:

Die MSDN-Anweisung ist irreführend. Double.Epsilon stellt den kleinsten darstellbaren Gleitkommawert ungleich Null dar. Daher kann es als Epsilon in den Beispielen im Stack Overflow-Thread „Was ist der effektivste Weg für Float- und Double-Vergleiche?“ verwendet werden.

Für Gleichheit kann ein geeignetes Epsilon als Math geschätzt werden. Max(Math.Abs(x), Math.Abs(y)) * 1E-15, wobei x und y die verglichenen Double-Werte sind. Es ist jedoch wichtig zu beachten, dass sich Kürzungsfehler anhäufen können, sodass beim Vergleich berechneter Werte möglicherweise ein größeres Epsilon erforderlich ist.

Um Gleichheit zu implementieren, sind „größer als“, „kleiner als“, „kleiner als oder gleich“ und „größer als oder“ erforderlich gleich, kann der folgende Code verwendet werden:

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;
}

public static bool GreaterThan(double x, double y) {
    double epsilon = Math.Max(Math.Abs(x), Math.Abs(y)) * 1E-15;
    return x > y + epsilon;
}

public static bool LessThan(double x, double y) {
    double epsilon = Math.Max(Math.Abs(x), Math.Abs(y)) * 1E-15;
    return x < y - epsilon;
}

public static bool LessThanOrEqualTo(double x, double y) {
    double epsilon = Math.Max(Math.Abs(x), Math.Abs(y)) * 1E-15;
    return x <= y + epsilon;
}

public static bool GreaterThanOrEqualTo(double x, double y) {
    double epsilon = Math.Max(Math.Abs(x), Math.Abs(y)) * 1E-15;
    return x >= y - epsilon;
}
Nach dem Login kopieren

Das obige ist der detaillierte Inhalt vonWie sollte Double.Epsilon für genaue Gleitkommavergleiche 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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage