Урок: выбрать допуск для сравнения вычисленных значений
При работе с приближёнными числами часто нужен допуск, а не точное равенство. Урок показывает явную комбинацию абсолютной и относительной погрешности без обещания универсальной формулы для всех задач.
Назначение
При работе с приближёнными числами часто нужен допуск, а не точное равенство. Урок показывает явную комбинацию абсолютной и относительной погрешности без обещания универсальной формулы для всех задач.
Как это работает
Абсолютный допуск помогает около нуля, относительный учитывает масштаб. В учебной функции сначала исключаются нечисловые и бесконечные значения. Выбранные константы иллюстративны и должны заменяться требованиями приложения.
Пример
function closeEnough(a, b, absolute = 1e-9, relative = 1e-9) {
if (!Number.isFinite(a) || !Number.isFinite(b)) return false;
return Math.abs(a - b) <= Math.max(absolute, relative * Math.max(Math.abs(a), Math.abs(b)));
}
console.log(closeEnough(0.1 + 0.2, 0.3));
console.log(closeEnough(1000000, 1000000.0001));
console.log(closeEnough(1, 1.1));
Что должно получиться
Для выбранных учебных допусков первые два сравнения проходят, третье — нет. Функция выражает конкретное правило близости, а не исправляет исходную арифметику.
Граница применения и частая ошибка
Такая близость не обязана быть транзитивной и не подходит как универсальное равенство ключей. Ограничьте область допустимых величин, чтобы разность не переполнялась. Для точных счётчиков и денежных сумм сначала выбирают подходящее представление, а не маскируют ошибки допуском.
Самостоятельная проверка
Проверьте числа около нуля, отрицательные значения и NaN. Уменьшите допуски и объясните изменения. Запишите, какой максимальный разброс действительно допустим для вашей измеряемой величины.