es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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;

}

Tags:  , ,

Answer

  1. Avatar for 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.

Comments are closed.