Сравнение двух чисел с плавающей запятой чем-то вроде a_float == b_float
ищет проблемы, поскольку a_float / 3.0 * 3.0
может быть не равно a_float
из-за ошибки округления.
Что обычно делает, это что-то вроде fabs(a_float - b_float) < tol
.
Как рассчитать tol
?
Идеальный допуск должен быть больше, чем значение одной или двух наименее значимых цифр. Поэтому, если число с плавающей запятой с единственной точностью используется tol = 10E-6
должно быть примерно правильным. Однако это не подходит для общего случая, когда a_float
может быть очень маленьким или может быть очень большим.
Как правильно вычислять tol
для всех общих случаев? Я лично интересуюсь случаями C или С++.