Разница между способами сравнения чисел с плавающей точкой

Кажется, есть много подходов, чтобы судить, идентичны ли два числа с плавающей точкой. Вот несколько примеров, которые я нашел:

  1. fabs(x - y) < n * FLT_EPSILON * fabs(x) ИЛИ ЖЕ fabs(x - y) < n * FLT_EPSILON * fabs(y)

  2. fabs(x - y) < n * FLT_EPSILON * fabs(x + y)

  3. fabs(x - y) < n * FLT_EPSILON * fabs(x + y) || fabs(x - y) < FLT_MIN)

  4. fabs(x - y) / sqrt(x * x + y * y + FLT_EPSILON * FLT_EPSILON) < n * FLT_EPSILON

Я действительно запутался в них. Предположим, что есть лучший способ сравнить два числа с плавающей запятой, который является самым быстрым и самым точным, другие подходы даже не должны существовать. Так что у этих разных способов должны быть свои плюсы и минусы.

Мой вопрос: какой подход самый быстрый / самый точный / самый практичный?

Ссылочные ссылки:

http://accu.org/index.php/journals/1558 (1 и 4)

/questions/12637885/how-dangerous-is-it-to-compare-floating-point-values/12637903#12637903 (2 и 3)


Пояснение: по крайней мере, я не думаю, что "самый быстрый / самый точный" в первую очередь основан на мнении.

1 ответ

Самый быстрый и точный x == y, Я часто использую его в ситуациях, когда знаю, что расчеты точные. В некоторых других случаях я округляю одно из чисел в соответствии с требованиями конкретного приложения, а затем делаю точное сравнение.

До сих пор мне не нужно было использовать одно из более сложных выражений из вашего вопроса. Но опять же, может быть, я просто не делал "настоящих вычислений".

Другие вопросы по тегам