• Viernes 15 de Noviembre de 2024, 08:01

Autor Tema:  Re: introduce un valor: 1e130 ????  (Leído 1757 veces)

jubilubi

  • Nuevo Miembro
  • *
  • Mensajes: 22
    • Ver Perfil
    • http://www.diversioNESjubilubi.3a2.com
Re: introduce un valor: 1e130 ????
« en: Viernes 3 de Octubre de 2003, 20:21 »
0
Estoy tratando de hacer un programa que me resuelva ecuaciones cuadraticas de la forma a(x*x)+bx+c=0; tengo lo siguiente:

#include <stdio.h>  //printf(); scanf();
#include <conio.h>  //clrscr(); gotoxy(); cprintf(); getch();
#include <math.h> //abs(); sqrt();

void main(void)
{
   //declaracion de variables
   int d=1; //signo de b
   float a,b,c; //datos de la ecuacion: a(x*x)-bx+c=0
   float band=0; //bandera (si el resultado de la raiz es negativo)
   float res_raiz; //resultado de la raiz
   float x1,x2,x3,x4; //incognitas a encontrar
   float raiz_cuad; //(b*b)-4ac

   clrscr();
   gotoxy(10,2);printf("introduzca el valor de a: ");
   scanf("%f",&a);
   gotoxy(10,3);printf("introduzca el valor de b: ");
   scanf("%f",&b);
   gotoxy(10,4);printf("introduzca el valor de c: ");
   scanf("%f",&c);
   if (b<0) //si b<0...
   {
      d=-1; //...entonces en el signo de b es negativo
   }
   raiz_cuad=(b*b)-(4*(a*c));
   if (raiz_cuad<0) //si el resultado de (b*b)-4ac es < 0...
   {
      raiz_cuad=abs(raiz_cuad); //valor absoluto de (b*b)-4ac
      band=1; //...entonces bandera = 1 "(b*b)-4ac es negativo"
   }
   res_raiz=sqrt(raiz_cuad);
   x1=((-b)+res_raiz)/(2*a);
   x2=((-b)-res_raiz)/(2*a);
   x3=d*(-1*((abs(b)+(res_raiz))/(2*a)));
   x4=c/(a*x3);
   gotoxy(10,10);printf("el resultado de x1 es:%.4f",x1);
   gotoxy(10,12);printf("el resultado de x2 es:%.4f",x2);
   gotoxy(10,16);printf("el resultado de x3 es:%.4f",x3);
   gotoxy(10,18);printf("el resultado de x4 es:%.4f",x4);
   if (band==1) //si bandera = 1
   {
      gotoxy(10,14);printf("el resultado de la raiz es negativo");
   }
   getch();
}

A este programa, si le meto valores muy grandes o muy pequeños, por ejemplo: 1e130 (uno por 10 a la 130) me saca del programa sin imprimir algo en pantalla. ¿como le hago para el programa me reconozca este tipo de cantidades (1e130)?

jubilubi

  • Nuevo Miembro
  • *
  • Mensajes: 22
    • Ver Perfil
    • http://www.diversioNESjubilubi.3a2.com
Re: introduce un valor: 1e130 ????
« Respuesta #1 en: Sábado 4 de Octubre de 2003, 16:19 »
0
ya realize algunos cambios:
en lugar de utilizar %f utilizo %e y en lugar de utilizar float utilizo long double... me queda asi:
#include <stdio.h> //printf(); scanf();
#include <conio.h> //clrscr(); gotoxy(); cprintf(); getch();
#include <math.h> //abs(); sqrt();

void main(void)
{
//declaracion de variables
int d=1; //signo de b
long double a,b,c; //datos de la ecuacion: a(x*x)-bx+c=0
int band=0; //bandera (si el resultado de la raiz es negativo)
long double res_raiz; //resultado de la raiz
long double x1,x2,x3,x4; //incognitas a encontrar
float raiz_cuad; //(b*b)-4ac

clrscr();
gotoxy(10,2);printf("introduzca el valor de a: ");
scanf("%e",&a);
gotoxy(10,3);printf("introduzca el valor de b: ");
scanf("%e",&b);
gotoxy(10,4);printf("introduzca el valor de c: ");
scanf("%e",&c);
if (b<0) //si b<0...
{
d=-1; //...entonces en el signo de b es negativo
}
raiz_cuad=(b*b)-(4*(a*c));
if (raiz_cuad<0) //si el resultado de (b*b)-4ac es < 0...
{
raiz_cuad=abs(raiz_cuad); //valor absoluto de (b*b)-4ac
band=1; //...entonces bandera = 1 "(b*b)-4ac es negativo"
}
res_raiz=sqrt(raiz_cuad);
x1=((-b)+res_raiz)/(2*a);
x2=((-b)-res_raiz)/(2*a);
x3=d*(-1*((abs(b)+(res_raiz))/(2*a)));
x4=c/(a*x3);
gotoxy(10,10);printf("el resultado de x1 es:%e",x1);
gotoxy(10,12);printf("el resultado de x2 es:%e",x2);
gotoxy(10,16);printf("el resultado de x3 es:%e",x3);
gotoxy(10,18);printf("el resultado de x4 es:%e",x4);
if (band==1) //si bandera = 1
{
gotoxy(10,14);printf("el resultado de la raiz es negativo");
}
getch();
}

Ahora no me saca del programa sin imprimirme algo en pantalla. El problema es que, por ejemplo, si introduzco los siguientes valores:

a=1
b=-1e130
c=1e130

Si dentro del programa intruduzco esta linea de codigo:
printf("%e(x*x) + %ex + %e = 0",a,b,c);
me deberia imprimir en pantalla lo siguiente (a menos que este equivocado):

1(x*x) + -1e130x + 1e130 = 0

pero me imprime otro tipo de valores:

1e-290(x*x) + -1e+6111x + 0.38=000e+307 = 0

Y en los resultados:

x1= 1e-272f
x2= 1e-272f
x3= 1e-272f
x4 = 1e-288f

¿En que estoy mal?
¿Que tendria que hacer para realizar este tipo de operaciones?
Les agradeceria muchisimo su ayuda.

jubilubi

  • Nuevo Miembro
  • *
  • Mensajes: 22
    • Ver Perfil
    • http://www.diversioNESjubilubi.3a2.com
Re: introduce un valor: 1e130 ????
« Respuesta #2 en: Sábado 25 de Octubre de 2003, 16:13 »
0
Creo que no hay mucha ayuda...
Unos compañeros me dijeron que utilize programación orientada a objetos (c++) empleando cin y cout; y que con eso el problema queda resuelto. ¿que tiene que ver el utilizar c o c++?¿en POO no utilizo mascaras (%d,%f,etc)?¿por que me dijeron que utilizando PPO ya no tendria problemas?si el problema se resuelve utilizando PPO, debe de haber una forma de resolverse utilizando c ¿o no?

JuanK

  • Miembro de ORO
  • ******
  • Mensajes: 5393
  • Nacionalidad: co
    • Ver Perfil
    • http://juank.io
Re: introduce un valor: 1e130 ????
« Respuesta #3 en: Viernes 31 de Octubre de 2003, 19:46 »
0
lo primero debes trabajar tipos de datos mas grandes,   recomendacion unsigned long.

lo segundo para la impresion  debes utilizar %ld o  %uld habria que verificar la documentacion, de los cual te informareel fin de semana.

estos problemas son comunes con las portencias.
[size=109]Juan Carlos Ruiz Pacheco
[/size]
Microsoft Technical Evangelist
@JuanKRuiz
http://juank.io

jubilubi

  • Nuevo Miembro
  • *
  • Mensajes: 22
    • Ver Perfil
    • http://www.diversioNESjubilubi.3a2.com
Re: introduce un valor: 1e130 ????
« Respuesta #4 en: Lunes 3 de Noviembre de 2003, 02:54 »
0
gracias juank... no conocia ese tipo de mascaras (%ld %uld). esperare tu respuesta el fin de semana. De cualquier forma tratare de buscar acerca de estas mascaras. Oye, al utilizar unsigned long, no podria introducir numeros negativos (¿o si?) por eso estoy utilizando long double. SI estoy equivocado en esto te agradeceria muchisimo que me lo explicaras.

Super_G

  • Miembro MUY activo
  • ***
  • Mensajes: 375
    • Ver Perfil
introduce un valor: 1e130 ????
« Respuesta #5 en: Lunes 3 de Noviembre de 2003, 03:46 »
0
No puedes utilisar numeros con signo con un unsigned long, ya que "unsigned" significa "sin signo" o algo asi, solo numeros positivos