Используется для сравнения плавающей запятой со следующей функцией. Однако я просто проверяю, что C++ 11 предоставляет некоторую функцию сравнения с плавающей запятой, такую как isgreaterequal
. Мой вопрос: должен ли я заменить его на функции в стандарте?сравнение с плавающей запятой в C++ 11
bool isEqual(double lhs, double rhs, double epsilon = /std::numeric_limits<double>::epsilon())
{
if (lhs == rhs)
{
return true;
}
return fabs(lhs - rhs) <= ((fabs(lhs) > fabs(rhs) ? fabs(rhs) : fabs(lhs)) * epsilon);
}
Это не правильный способ сравнения чисел с плавающей запятой. Во-первых, он уменьшает ложные негативы за счет увеличения ложных срабатываний. Во-вторых, при отсутствии конкретных знаний о предыдущих вычислениях нет причин ожидать, что ошибка будет пропорциональна левой. В-третьих, один эпсилон ошибки необычен для любых, но простейших вычислений. В-четвертых, существует огромный разрыв в допуске ошибок; когда 'lhs' падает ниже' rhs', допуск переходит от почти 'rhs * epsilon' к' rhs', что составляет примерно 2 ** 52. –
@EricPostpischil 1. Такова арифметика с конечной точностью. 2-3. Следовательно, 'epsilon' является переменным аргументом. 4. Проверьте parens; меньший из 'lhs' или' rhs' умножается на 'epsilon'. – Potatoswatter
@Potatoswatter: Вы правы относительно 4. 1: Тот факт, что точность конечна, не делает это правильным. Следует использовать другие подходы. 2: Передача значения epsilon, отличного от значения по умолчанию, не изменяет того факта, что он умножается пропорционально сравниваемым значениям. 3: По умолчанию слишком мало. –