Я экспериментирую с различными реализациями метода Ньютона для вычисления квадратных корней. Одно из важных решений - когда завершить алгоритм.
Очевидно, не годится использовать абсолютную разницу между 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;
}
Оба являются математически эквивалентен , но есть ли причина предпочесть одну форму другой?