Какое сравнение с плавающей запятой более точное и почему?

Я экспериментирую с различными реализациями метода Ньютона для вычисления квадратных корней. Одно из важных решений - когда завершить алгоритм.

Очевидно, не годится использовать абсолютную разницу между y * y и x , где y - текущая оценка квадратного корня из x , поскольку для больших значений x может оказаться невозможным представить его квадратный корень с достаточной точностью.

Итак, я должен использовать относительные критерии. Наивно, я бы использовал что-то вроде этого:

static int sqrt_good_enough(float x, float y) {
  return fabsf(y*y - x) / x < EPS;
}

И, похоже, это очень хорошо работает. Но недавно я начал читать книгу Кернигана и Плаугера Элементы стиля программирования , и они дают программу на Фортране для того же алгоритма в главе 1, критерии завершения которой, переведенные на C, будут следующими:

static int sqrt_good_enough(float x, float y) {
  return fabsf(x/y - y) < EPS * y;
}

Оба являются математически эквивалентен , но есть ли причина предпочесть одну форму другой?

14
задан lindelof 10 March 2012 в 04:19
поделиться