Heim >Backend-Entwicklung >C++ >Wie soll ich Gleitkommazahlen auf Gleichheit und Ungleichheit vergleichen?

Wie soll ich Gleitkommazahlen auf Gleichheit und Ungleichheit vergleichen?

DDD
DDDOriginal
2025-01-06 01:09:38390Durchsuche

How Should I Compare Floating-Point Numbers for Equality and Inequality?

Bestimmen der Gleichheit von Gleitkommazahlen mithilfe von Double.Epsilon

In der MSDN-Dokumentation wird empfohlen, zur Feststellung einen Wert zu verwenden, der größer als die Double.Epsilon-Konstante ist die akzeptable absolute Differenzspanne bei der Bestimmung, ob zwei Gleitkommazahlen als gleich angesehen werden können. Diese Empfehlung sorgt jedoch für einige Verwirrung.

Hat Double.Epsilon einen praktischen Nutzen in Vergleichen?

Der MSDN-Wortlaut hat zu Missverständnissen über den praktischen Nutzen von Double geführt. Epsilon. Wie in der bereitgestellten Antwort angegeben, stellt Double.Epsilon den kleinsten darstellbaren nicht denormalen Gleitkommawert dar, der nicht 0 ist. Es gibt lediglich die Mindestgröße eines Kürzungsfehlers an, keinen akzeptablen Spielraum für einen Vergleich.

Berechnung eines geeigneten Epsilons für Gleichheitsvergleiche

Für Gleichheitsvergleiche besteht ein praktischerer Ansatz darin, ein Epsilon basierend auf zu verwenden die Größe der verglichenen Werte. 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;
}

Diese Methode verwendet den größeren der Absolutwerte der beiden Zahlen multipliziert mit einer kleinen Konstante (1E-15), um den akzeptablen Spielraum für den Vergleich zu bestimmen.

Berücksichtigung von Größer-als- und Kleiner-als-Vergleichen

Für Vergleiche wie größer als oder kleiner als gilt das gleiche Prinzip. Das Epsilon sollte basierend auf der Größe der verglichenen Zahlen berechnet werden, um potenzielle Kürzungsfehler zu berücksichtigen.

Beste Implementierung für Gleichheits- und Ungleichheitsvergleiche

Zusammenfassend: Double .Epsilon kann nicht direkt als akzeptabler Spielraum für Gleichheits-, Größer-, Kleiner-, Kleiner-gleich- oder Größer-gleich-Vergleiche für Gleitkommazahlen verwendet werden. Stattdessen sollte ein kontextspezifisches Epsilon berechnet werden, um genaue Vergleiche zu gewährleisten.

Das obige ist der detaillierte Inhalt vonWie soll ich Gleitkommazahlen auf Gleichheit und Ungleichheit vergleichen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
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