Сегодня я просматривал некоторый код C ++ (написанный кем-то другим) и нашел этот раздел:
double someValue = ...
if (someValue < std::numeric_limits<double>::epsilon() &&
someValue > -std::numeric_limits<double>::epsilon()) {
someValue = 0.0;
}
Я пытаюсь понять, имеет ли это смысл.
Документация для epsilon()
говорит:
Функция возвращает разницу между 1 и наименьшим значением больше 1, которое может быть представлено [двойным].
Относится ли это и к 0, т. epsilon()
Е. Наименьшее значение больше 0? Или есть числа между 0
и 0 + epsilon
которые могут быть представлены double
?
Если нет, то сравнение не эквивалентно someValue == 0.0
?
numeric_limits<>::epsilon
вводит в заблуждение и не имеет значения. Нам нужно принять 0, если фактическое значение отличается не более чем на 0 от 0. И ε следует выбирать на основе спецификации задачи, а не на машинно-зависимом значении. Я подозреваю, что текущий эпсилон бесполезен, поскольку даже несколько операций FP могут накапливать ошибку больше, чем эта.