Newton-Raphson in Pascal, not very good results(牛顿-拉夫森在帕斯卡,结果不是很好)
本文介绍了牛顿-拉夫森在帕斯卡,结果不是很好的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我用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
这篇关于牛顿-拉夫森在帕斯卡,结果不是很好的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
沃梦达教程
本文标题为:牛顿-拉夫森在帕斯卡,结果不是很好
基础教程推荐
猜你喜欢
- 如何定义双括号/双迭代器运算符,类似于向量的向量? 2022-01-01
- 什么是T&&(双与号)在 C++11 中是什么意思? 2022-11-04
- C++,'if' 表达式中的变量声明 2021-01-01
- 如何在 C++ 中处理或避免堆栈溢出 2022-01-01
- 运算符重载的基本规则和习语是什么? 2022-10-31
- 设计字符串本地化的最佳方法 2022-01-01
- 您如何将 CreateThread 用于属于类成员的函数? 2021-01-01
- 调用std::Package_TASK::Get_Future()时可能出现争用情况 2022-12-17
- C++ 程序在执行 std::string 分配时总是崩溃 2022-01-01
- C++ 标准:取消引用 NULL 指针以获取引用? 2021-01-01