Heute habe ich einen C ++ - Code (von jemand anderem geschrieben) durchgesehen und diesen Abschnitt gefunden:
double someValue = ...
if (someValue < std::numeric_limits<double>::epsilon() &&
someValue > -std::numeric_limits<double>::epsilon()) {
someValue = 0.0;
}
Ich versuche herauszufinden, ob das überhaupt Sinn macht.
Die Dokumentation für epsilon()
sagt:
Die Funktion gibt die Differenz zwischen 1 und dem kleinsten Wert größer als 1 zurück, der darstellbar ist [durch ein Doppel].
Gilt dies auch für 0, dh epsilon()
ist der kleinste Wert größer als 0? Oder gibt es Zahlen zwischen 0
und 0 + epsilon
die durch a dargestellt werden können double
?
Wenn nicht, ist der Vergleich dann nicht gleichbedeutend mit someValue == 0.0
?
numeric_limits<>::epsilon
irreführend und irrelevant. Wir wollen 0 annehmen, wenn der tatsächliche Wert nicht mehr als einige ε von 0 abweicht. Und ε sollte basierend auf der Problemspezifikation und nicht basierend auf einem maschinenabhängigen Wert ausgewählt werden. Ich würde vermuten, dass das aktuelle Epsilon nutzlos ist, da bereits wenige FP-Operationen einen größeren Fehler verursachen können.