HTML, CSS, PHP, JavaScript, Java... tus dudas por aquí...
por Alquimia » Sep 2009, 21:33
Hola, tengo un pequeño problema desde hace un tiempo, a ver si me pueden ayudar. El programa es un ejercicio de trabajo con punteros y paso de parámetros por punteros. Se supone que se crea una función que capture los coeficientes a,b y c de una ecuación cuadrática y cambie los valores almacenados en a y b a través del uso de sus direcciones de memoria. Les muestro mi código. - Código: Seleccionar todo
#include <stdio.h> #include <math.h> #include <string.h>
int funcion (float *a, float *b, float *c);
void main() { float a,b,c;
printf ("\t\tEcuacion cuadratica\n\n"); printf ("Coeficiente a: "); scanf ("%f",&a); printf ("Coeficiente b: "); scanf ("%f",&b); printf ("Coeficiente c: "); scanf ("%f",&c); int valida; funcion (&a,&b,&c); valida = (a==0 && b==0); if(!valida) printf ("Las soluciones son: %.3f y %.3f. \n", a,b); else printf ("Tiene raíces complejas.\n"); }
int funcion (float *ah, float *be, float *ce) { //Comprueba si tiene raíces complejas if ((*be * *be -(4* *ah * *ce)) < 0){ *ah = 0; *be = 0; } else{ float aux = *ah; *ah = (-(*be) + sqrt (*be * *be -4 * aux * *ce)) /2* aux; *be = (-(*be) - sqrt (*be * *be -4 * aux * *ce)) /2* aux; } }
El programa funciona correctamente para operaciones como a=1,b=2,c=-3 ; pero pierde su efectividad al tratarse de números más grandes. Por ejemplo... - Código: Seleccionar todo
Ecuacion cuadratica
Coeficiente a: 1 Coeficiente b: 2 Coeficiente c: -3 Las soluciones son: 1.000 y -3.000.
Lo que es correcto, pero... - Código: Seleccionar todo
Ecuacion cuadratica
Coeficiente a: 3 Coeficiente b: 4 Coeficiente c: -5 Las soluciones son: 7.077 y -19.077
Siendo que las soluciones son 0.78 y -2.11 Ojalá me puedan ayudar.
-

Alquimia
- Nivel 2
-
- Mensajes: 89
- Registrado: May 2009, 01:46
- Ubicación: Temuco, Chile.
- Twitter: @alexissaavedra
-
por elQuique » Sep 2009, 23:30
Debe ser, o es más bien es un problema de redondeo, quizás debas usar un tipo de variable de más precisión. Fíjate en 32 o 64bits, si soporta tu compilador y procesador, y en los dígitos de precisión:
-

elQuique
- Nivel 10
-
- Mensajes: 1740
- Registrado: May 2009, 18:43
- Ubicación: Florida, Uruguay
- Twitter: @elQuique
-
por Alquimia » Sep 2009, 02:04
Lo primero que hice fue cambiar todos los float por double, pero la combinación (1,2,-3) me devuelve que tiene raíces complejas :-S, luego los pasé a long double y obtengo resultados erróneos... He probado el código en Windows, con Dev-C++ y en Linux con gcc, la verdad que ya no tengo ni idea qué puedo hacer. :-S
-

Alquimia
- Nivel 2
-
- Mensajes: 89
- Registrado: May 2009, 01:46
- Ubicación: Temuco, Chile.
- Twitter: @alexissaavedra
-
por Alquimia » Sep 2009, 00:43
Al final era una estupidez....
Estaba dividiendo por 2 y multiplicando por a, en vez de dividir por 2a....
En esa parte había que poner (2 * a) y se solucionaba. xD !!!
-

Alquimia
- Nivel 2
-
- Mensajes: 89
- Registrado: May 2009, 01:46
- Ubicación: Temuco, Chile.
- Twitter: @alexissaavedra
-
por elQuique » Sep 2009, 08:58
jaja :P
-

elQuique
- Nivel 10
-
- Mensajes: 1740
- Registrado: May 2009, 18:43
- Ubicación: Florida, Uruguay
- Twitter: @elQuique
-
por Link » Oct 2010, 18:25
Porque no lo haces mas sencillo usando cout y cin? Aparte, si lo corres en DEV-C++ no funciona en codigo fuente ;) Declaras "float funcion (float *a, float *b, float *c);" fuera del programa consecutivo, y tienes que declarar afuera primero "int main(int argc, char *argv[])" y dentro declarar ahora sí "float funcion (float *a, float *b, float *c);" Otra, usas caracteres, y dejas afuera el system("PAUSE"); return EXIT_SUCCESS; Al usar caracteres como tu programa, para un pause de pantalla se muestra return PID; y tu no lo hiciste...
-

Link
- Nivel 2
-
- Mensajes: 47
- Registrado: May 2009, 20:14
- Ubicación: México
- Twitter: @
Volver a Programación
¿Quién está conectado?
Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 0 invitados
|
|