牛顿-拉夫森在帕斯卡,结果不是很好
我用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
相关文章