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:
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; }
public static bool ApproximatelyEqualRelative(double x, double y, double tolerance) { return Math.Abs(x - y) / Math.Max(Math.Abs(x), Math.Abs(y)) <= tolerance; }
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; }
Kleiner als:
public static bool LessThan(double x, double y) { return ApproximatelyEqualRelative(x - y, y, 1E-15) < 0; }
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; }
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!