
Fallo en programa de C
Publicado por Wilfredo el velloso (12 intervenciones) el 30/11/2017 04:10:20
Tengo un problema con un ejercicio en C.
Tengo que calcular la raíz cuadrada de un número, pero a no ser que sea exacta no me la calcula, y creo que se queda en el bucle de la función indefinidamente.
El ejercicio es el siguiente:
El metodo de Newton para hallar la raiz cuadrada de un numero real positivo X consiste en lo siguiente: para calcular la raiz cuadrada de un numero X tal que el cuadrado de la solucion diera de X menos de un cierto error E, comenzamos con la aproximacion a = X/2. Si |(a * a) -X| < E paramos los calculos y el resultado es a. Si no, reemplazamos a con la siguiente aproximacion definida por (a+X/a)/2. Entonces comprobamos si esta aproximacion es lo sucientemente buena de la misma manera que antes lo hicimos. Si lo es, el calculo finaliza y si no prosigue iterativamente, estando garantizado que la aproximacion converge. Escribe una funcion que implemente este metodo dados X y el error E aceptable, y un programa que la utilice.
y el código es éste:
Muchas gracias por vuestra ayuda muchachos/as!!


El ejercicio es el siguiente:
El metodo de Newton para hallar la raiz cuadrada de un numero real positivo X consiste en lo siguiente: para calcular la raiz cuadrada de un numero X tal que el cuadrado de la solucion diera de X menos de un cierto error E, comenzamos con la aproximacion a = X/2. Si |(a * a) -X| < E paramos los calculos y el resultado es a. Si no, reemplazamos a con la siguiente aproximacion definida por (a+X/a)/2. Entonces comprobamos si esta aproximacion es lo sucientemente buena de la misma manera que antes lo hicimos. Si lo es, el calculo finaliza y si no prosigue iterativamente, estando garantizado que la aproximacion converge. Escribe una funcion que implemente este metodo dados X y el error E aceptable, y un programa que la utilice.
y el código es éste:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
/*********************************************************************************************************************************/
/*
Programa que halla el valor de una raíz cuadrada con un cierto error mediante el método de Newton
*/
/*********************************************************************************************************************************/
#include <stdio.h>
#include <math.h>
#define TRUE 1
#define FALSE 0
double RaizNewton(double X, double E){
int e, a, raiz, PermanenciaBucle1, PermanenciaBucle2;
a = X;
PermanenciaBucle1 = TRUE;
PermanenciaBucle2 = TRUE;
while (PermanenciaBucle1==TRUE && PermanenciaBucle2==TRUE){
a = a/2;
e = fabs(a*a-X);
if (e < E){
raiz = a;
PermanenciaBucle1 = FALSE;
}
a = (a+X/a)/2;
e = fabs(a*a-X);
if (e < E){
PermanenciaBucle2 = FALSE;
}
}
if (PermanenciaBucle1 == TRUE){
raiz = a;
}
return raiz;
}
/*********************************************************************************************************************************/
/* main */
/*********************************************************************************************************************************/
int main()
{
double cuadrado, error, resultado;
/* Preguntar por cuadrado hasta que sea positivo */
do {
printf("Introduzca el numero del que desea calcular su raiz cuadrada: ");
scanf("%lg", &cuadrado);
} while (cuadrado <= 0);
printf("Introduzca el error: ");
scanf("%lg", &error);
/* Si el error es negativo, se convierte en positivo */
if (error < 0){
error = -error;
}
resultado = RaizNewton (cuadrado, error);
printf("El cuadrado de %lg con un error de %lg es:\n %lg", cuadrado, error, resultado);
}
Muchas gracias por vuestra ayuda muchachos/as!!


Valora esta pregunta


0