Ist die Verwendung von Maschinen-Epsilon für Gleitkomma-Gleichheitstests geeignet?

Dies ist ein Follow-up zuPrüfung auf Gleitkommawertgleichheit: Gibt es einen Standardnamen für die Konstante „Genauigkeit“?.
Es gibt eine sehr ähnliche FrageDouble.Epsilon für Gleichheit, größer als, kleiner als, kleiner als oder gleich, größer als oder gleich.

Es ist bekannt, dass ein Gleichheitstest für zwei Gleitkommawertex undy sollte eher so aussehen (anstatt eines einfachen =):

Abs(x - y) <Epsilo , woEpsilo ist ein sehr kleiner Wert.

Wie wähle ich einen Wert fürEpsilo?

Es wäre natürlich vorzuziehen, für @ zu wählEpsilo möglichst kleiner Wert, um die höchstmögliche Genauigkeit für die Gleichheitsprüfung zu erhalten.

Als Beispiel bietet das .NET Framework eine KonstanteSystem.Double.Epsilon (= 4,94066 × 10 -324), welches das kleinste positive @ darstelSystem.Double Wert, der größer als Null ist.

s stellt sich jedoch heraus, dass dieser bestimmte Wert nicht zuverlässig als @ verwendet werden kanEpsilo, schon seit

0 +System.Double.Epsilon ≠ 0

1 +System.Double.Epsilon = 1 (!)

was ist, wenn ich richtig verstehe, weil diese Konstante kleiner ist alsmachine epsilon.

→ Ist das richtig?

→ Bedeutet das auch, dass ich @ zuverlässig nutzen kanepsilon: = machine epsilon für Gleichstellungstests?

Diese beiden Fragen wurden entfernt, da sie durch die zweite SO-Frage, die oben verlinkt ist, bereits ausreichend beantwortet wurden.

Der mit Wikipedia verknüpfte Artikel besagt, dass für 64-Bit-Gleitkommazahlen (dh dasdouble type in many languages), machine epsilon ist gleich:

2 -53 Oder ca. 0.000000000000000111 (eine Zahl mit 15 Nachkommastellen)

→ Ergibt sich daraus, dass alle 64-Bit-Gleitkommawerte garantiert auf 14 (wenn nicht 15) Stellen genau sind?

Antworten auf die Frage(8)

Ihre Antwort auf die Frage