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