Сьогодні я переглянув якийсь код 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. І ε слід вибирати виходячи із специфікації задачі, а не від машинно залежного значення. Я б підозрював, що поточний епсілон марний, оскільки навіть лише кілька операцій ПП можуть накопичити помилку, більшу від цього.