C/Visual C - Fallo en programa de C

 
Vista:
sin imagen de perfil

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 di era 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 defi nida por (a+X/a)/2. Entonces comprobamos si esta aproximacion es lo su cientemente 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
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil
Val: 88
Ha mantenido su posición en C/Visual C (en relación al último mes)
Gráfica de C/Visual C

Fallo en programa de C

Publicado por Thanatos (29 intervenciones) el 30/11/2017 19:00:19
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
/*
 *  Calcula la raíz cuadrada aproximada de un número
 *  real positivo, mediante el método de Newton.
 */
 
#include <stdio.h>
#include <math.h>   // fabs()
 
double leerNumero(void);
double leerEpsilon(void);
double raizNewton(double, double);
 
int main(void) {
    double numero  = leerNumero();
    double epsilon = leerEpsilon();
    double raiz = raizNewton(numero, epsilon);
 
    printf(
        "La raiz aproximada de %lf (E = %lf) es %lf\n",
        numero, epsilon, raiz
    );
    return 0;
}
 
double leerNumero(void) {
    double numero = -1.0;
 
    while (numero < 0.0) {
        printf("Ingrese un numero real positivo:\nnumero = ");
        scanf("%lf", &numero);
    }
    printf("\n");
    return numero;
}
 
double leerEpsilon(void) {
    double epsilon;
 
    printf("Ingrese el valor de epsilon:\nepsilon = ");
    scanf("%lf", &epsilon);
 
    if (epsilon < 0.0) {
        epsilon *= -1.0;
    }
    printf("\n");
    return epsilon;
}
 
double raizNewton(double numero, double epsilon) {
    double ap = numero / 2.0;  // aproximación
    double nuevaAp;            // nueva aproximación
 
    while (fabs(ap - (nuevaAp = (numero / ap + ap) / 2.0)) > epsilon) {
        ap = nuevaAp;
    }
    return ap;
}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil
Val: 8
Ha aumentado su posición en 3 puestos en C/Visual C (en relación al último mes)
Gráfica de C/Visual C

Fallo en programa de C - error en variable e y a dentro de la dunción RaizNewton y declaración tipo.

Publicado por Abel Gustavo (2 intervenciones) el 04/12/2017 01:58:48
Fallo en programa de C - error en variable e y a dentro de la dunción RaizNewton y declaración tipo en las variales a, e, raiz.

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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
/*********************************************************************************************************************************/
 
/*

    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 PermanenciaBucle1, PermanenciaBucle2;
    double e, a, raiz;
    a = X;
 
    PermanenciaBucle1 = TRUE;
 
    PermanenciaBucle2 = TRUE;
 
        a = a/2;
 
    while (PermanenciaBucle1==TRUE && PermanenciaBucle2==TRUE){
 
 
        e = fabs(X/a+a)/2;
 
 
        if (e < E){
 
            raiz = a;
 
            PermanenciaBucle1 = FALSE;
 
        }
 
 
 
        a = (a+X/a)/2;
 
        e = fabs(X/a+a)/2;
 
 
        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);
 
}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar