牛顿-拉夫森在帕斯卡,结果不是很好

2022-09-02 00:00:00 c++ pascal newtons-method

我用Pascal语言实现了牛顿-拉夫森算法。这很奇怪,因为同样的代码在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;
}

解决方案

repeat ... until C;当表达式C的计算结果为真时,循环终止。在您的代码中,在第一次迭代后abs(x - a / x) > eps为为True,因此循环终止。

终止条件应颠倒:

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

Online demo

相关文章