Dzisiaj przeglądałem kod C ++ (napisany przez kogoś innego) i znalazłem tę sekcję:
double someValue = ...
if (someValue < std::numeric_limits<double>::epsilon() &&
someValue > -std::numeric_limits<double>::epsilon()) {
someValue = 0.0;
}
Próbuję dowiedzieć się, czy to w ogóle ma sens.
Dokumentacja epsilon()
mówi:
Funkcja zwraca różnicę między 1 a najmniejszą wartością większą niż 1, która jest reprezentowalna [podwójnie].
Czy dotyczy to również 0, tj epsilon()
. Czy najmniejsza wartość jest większa od 0? Czy też są liczby pomiędzy 0
i 0 + epsilon
które mogą być reprezentowane przez double
?
Jeśli nie, to czy porównanie nie jest równoważne someValue == 0.0
?
numeric_limits<>::epsilon
jest mylące i nie ma znaczenia. Chcemy założyć 0, jeśli rzeczywista wartość różni się nie więcej niż o jakieś ε od 0. I ε powinno być wybrane na podstawie specyfikacji problemu, a nie na wartości zależnej od maszyny. Podejrzewam, że obecny epsilon jest bezużyteczny, ponieważ nawet kilka operacji FP może skumulować większy błąd.