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