Я экспериментирую с различными реализациями метода Ньютона для вычисления квадратных корней. Одним из важных решений является прекращение работы алгоритма.
Очевидно, что он не будет использовать абсолютную разницу между y*y
и x
, где y
- текущая оценка квадратного корня из x
, потому что при больших значениях x
это может не можно представить свой квадратный корень с достаточной точностью.
Поэтому я должен использовать относительные критерии. Наивно я бы использовал что-то вроде этого:
static int sqrt_good_enough(float x, float y) {
return fabsf(y*y - x) / x < EPS;
}
И это работает очень хорошо. Но недавно я начал читать Kernighan и Plauger The Elements of Programming Style, и они дают программу Fortran для того же алгоритма в главе 1, критерии завершения которой переведены на C:
static int sqrt_good_enough(float x, float y) {
return fabsf(x/y - y) < EPS * y;
}
Оба являются математически эквивалентными, но есть ли причина для предпочтения одной формы над другой?