Разница между способами сравнения чисел с плавающей точкой
Кажется, есть много подходов, чтобы судить, идентичны ли два числа с плавающей точкой. Вот несколько примеров, которые я нашел:
fabs(x - y) < n * FLT_EPSILON * fabs(x)
ИЛИ ЖЕfabs(x - y) < n * FLT_EPSILON * fabs(y)
fabs(x - y) < n * FLT_EPSILON * fabs(x + y)
fabs(x - y) < n * FLT_EPSILON * fabs(x + y) || fabs(x - y) < FLT_MIN)
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
, Я часто использую его в ситуациях, когда знаю, что расчеты точные. В некоторых других случаях я округляю одно из чисел в соответствии с требованиями конкретного приложения, а затем делаю точное сравнение.
До сих пор мне не нужно было использовать одно из более сложных выражений из вашего вопроса. Но опять же, может быть, я просто не делал "настоящих вычислений".