На самом деле вопрос сравнения чисел с плавающей точкой, увы, не прост.
Ошибки округления могут накапливаться, и нужно их как-то оценивать.
Если в Вашем примере a и b имеют тип float или double (и отключена оптимизация, позволяющая хранить промежуточные результаты в регистрах), то проще будет написать (a == b) — результат будет тот же (хотя насчёт double я не совсем уверен, но практический смысл расписывать "длинный" способ отсутствует).
Вообще, "длинный" способ, конечно, корректнее, но тут нужно:
1) подобрать правильное EPSILON;
2) отдельно рассмотреть случай, когда числа a и b близки к нулю.
Оба пункта нужно рассматривать исходя из практических соображений, которые в каждом случае разные.
Например, я в одной из расчётных программ использовал примерно такую функцию:
bool areEqual(double x, double y)
{
static double SMALL_NUM = 1.0E-5;
if (abs(x) < SMALL_NUM && abs(y) < SMALL_NUM)
return abs(x-y) < SMALL_NUM;
else
return abs(x-y) < abs(x) * SMALL_NUM;
}
Всё работало отлично, пока не пришлось работать с физическими величинами в мелком масштабе (порядок величины в единицах СИ —
). Такие переменные пришлось сравнивать с нулём по-другому