На самом деле они не совсем эквивалентны математически, если только вы не напишите fabsf (y * y - x) / (y * y)
Но я думаю, что ключевым моментом является приведение выражения в соответствие с вашей формулой для вычисления y в итерации Ньютона. Например, если ваша формула y имеет вид y = (y + x / y) / 2, вам следует использовать стиль Кернигана и Плаугера. Если это y = (y * y + x) / (2 * y), вы должны использовать (y * y - x) / (y * y)
Как правило, критерии завершения должны заключаться в том, что abs (y (n + 1) - y (n)) достаточно мала (то есть меньше, чем y (n + 1) * EPS). Вот почему два выражения должны совпадать. Если они не совпадают точно, возможно, что тест завершения решит, что остаток не достаточно мал, в то время как разница в y (n) меньше, чем ошибка с плавающей запятой, из-за различного масштабирования. Результатом будет бесконечный цикл, потому что y (n) перестал изменяться, а критерии завершения никогда не выполняются.
Например, следующий код Matlab - это точно такой же решатель Ньютона, как и в первом примере, но он работает вечно:
x = 6.800000000000002
yprev = 0
y = 2
while abs(y*y - x) > eps*abs(y*y)
yprev = y;
y = 0.5*(y + x/y);
end
В версии на C / C ++ такая же проблема.