Aujourd'hui, je regardais du code C ++ (écrit par quelqu'un d'autre) et j'ai trouvé cette section:
double someValue = ...
if (someValue < std::numeric_limits<double>::epsilon() &&
someValue > -std::numeric_limits<double>::epsilon()) {
someValue = 0.0;
}
J'essaie de comprendre si cela a du sens.
La documentation de epsilon()
dit:
La fonction renvoie la différence entre 1 et la plus petite valeur supérieure à 1 qui est représentable [par un double].
Cela s'applique-t-il également à 0, c'est epsilon()
-à- dire que la plus petite valeur est supérieure à 0? Ou y a-t-il des nombres entre 0
et 0 + epsilon
qui peuvent être représentés par un double
?
Sinon, la comparaison n'est-elle pas équivalente someValue == 0.0
?
numeric_limits<>::epsilon
est trompeuse et non pertinente. Ce que nous voulons, c'est supposer 0 si la valeur réelle ne diffère pas de plus de quelques ε de 0. Et ε doit être choisi en fonction de la spécification du problème, et non en fonction d'une valeur dépendante de la machine. Je soupçonne que l'epsilon actuel est inutile, car même quelques opérations de FP peuvent accumuler une erreur supérieure à cela.