Newton-Raphson en Pascal, resultados no muy buenos.
Implementé el método de Newton-Raphson en Pascal. Es extraño porque el mismo código en C++ da buenos resultados (para 9 es 3), pero en Pascal para 9 es 3.25, ¿Por qué pasa esto?
Pascal:
Programa 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;
repetir
x := (x + a / x) / 2.0;
i := i + 1;
si (x * x = a) entonces romper;
si (i >= max_i) entonces romper;
hasta abs(x - a / x) > eps;
resultado := x;
end;
var
sqroot: real;
principio
sqroot := newton_raphson_iter(9, 0.001, 0.0000001, 10);
writeln(sqroot);
final.
C++:
#include
#include
using namespace std;
double sqroot(double num)
{
double x=num/2;
mientras(fabs(x-num/x)>0.000001)
{
x=(x+num/x)/2;
si(x*x==num) romper;
}
volver x;
}
int main()
{
cout << sqroot(9.0);
volver 0;
}
davy.ai
La diferencia en los resultados podría deberse a las diferencias en la forma en que estos dos lenguajes manejan la aritmética de punto flotante. Pascal y C ++ pueden tener diferentes precisiones predeterminadas para los números de punto flotante. Además, podría haber diferencias en la forma en que estos lenguajes manejan los errores de redondeo y los problemas de desbordamiento/subdesbordamiento. Se recomienda definir explícitamente la precisión y el formato de los cálculos de punto flotante para evitar tales problemas. Otra razón podría deberse a las diferencias en la forma en que las dos implementaciones manejan la condición
if (x * x = a)
(la igualdad de dos números de punto flotante no siempre es precisa). Se recomienda utilizar un valor de tolerancia en lugar de una comprobación de igualdad exacta.