Pascal 中的 Newton-Raphson,不是很好的结果

Newton-Raphson in Pascal, not very good results

我在 Pascal 中实现了 Newton-Raphson 方法。这很奇怪,因为相同的代码在 C++ 中给出了很好的结果(对于 9 是 3)但是在 Pascal 中对于 9 它是 3.25,为什么这样?

帕斯卡:

Program NewtonRaphsonIter(output);

{$mode objFPC}

function newton_raphson_iter(a: real; p: real; eps: real; max_i: integer) : real;
var
    x: real;
    i: integer;
begin
    x := a / 2.0;
    i := 0;
    
    repeat
        x := (x + a / x) / 2.0;
        i := i + 1;
        if (x * x = a) then break;
        if (i >= max_i) then break; 
    until abs(x - a / x) > eps;
    result := x;

end;

var
    sqroot: real;
begin
  
  sqroot := newton_raphson_iter(9, 0.001, 0.0000001, 10);
  writeln(sqroot);
  
end.

C++:

#include <iostream>
#include <cmath>
using namespace std;

double sqroot(double num)
{
    double x=num/2;
    while(fabs(x-num/x)>0.000001)
    {
        x=(x+num/x)/2;
        if(x*x==num) break;
    }
    return x;
}

int main()
{
    cout << sqroot(9.0);

    return 0;
}
当表达式 C 的计算结果为真时,

repeat ... until C; 循环终止。在您的代码中,在第一次迭代后 abs(x - a / x) > eps true,因此循环终止。

应该反转终止条件:

until abs(x - a / x) <= eps;

Online demo