• Jueves 25 de Abril de 2024, 00:29

Autor Tema:  Operacion con muchos digitos  (Leído 4466 veces)

jokerm

  • Nuevo Miembro
  • *
  • Mensajes: 8
    • Ver Perfil
Operacion con muchos digitos
« en: Viernes 25 de Marzo de 2011, 03:14 »
0
Hola a todos, me da gusto tener este foro como apoyo en mi aprendizaje. Posteo un  inconveniente que me surge y espero puedan ayudarme.

Lo que quiero hacer es una operacion en la que la computadora me de el numero total de segundos y que de su equivalencia en semanas, pero al realizar la operacion no es correcto el resultado.
Tengo el siguiente codigo


Código: C
  1. #include <stdio.h>
  2. #define seg 3600
  3.  
  4. void main()
  5. {
  6. double prueba,semana;
  7.      clrscr();
  8.      printf("Ingrese no de segundos para convertirlos");
  9.      scanf("%f",&segundo);
  10.      prueba = 24*12*seg;  //Aqui hago una simple operacion para determinar los seg en 1 semana, pero el resultado que arroja no es el correcto
  11.      semana = segundo/(24*12*seg);  //Aqui hace la operacion mas aparte una division, tampoco es correcto el resultado mostrado
  12.      printf("Son %g segundos en 1 semana n" "Sond %g semanas",prueba,semana);
  13.      getch();
  14. }
  15.  
  16.  


Agradesco mucho señlen mi error.
Saludos

Amilius

  • Miembro HIPER activo
  • ****
  • Mensajes: 665
    • Ver Perfil
Re: Operacion con muchos digitos
« Respuesta #1 en: Viernes 25 de Marzo de 2011, 03:40 »
0
No veo por ningún lado la declaración de la variable segundo.
Y es mejor usar constantes con tipo, como "24.0f".

ProfesorX

  • Moderador
  • ******
  • Mensajes: 796
  • Nacionalidad: mx
    • Ver Perfil
Re: Operacion con muchos digitos
« Respuesta #2 en: Viernes 25 de Marzo de 2011, 09:03 »
0
No se entiende bien que es lo que quieres hacer.

1. ¿Dado "x" segundos, quieres saber el equivalente en semanas? o
2. ¿Dado "x" semanas quieres saber el equivalente en segundos?

En todo caso tu formula esta mal. ya que una semana no contiene 12 dias.

Las equivalencias son asi:

1 semana = 7 dias
1 dia = 24 horas
1 hora = 60 minutos,
1 minuto = 60 segundos.

Por lo tanto, las formulas quedarian:

1. semanas = segundos / (7.0*24.0*60.0*60.0)
o
2. segundos = semanas*7.0*24.0*60.0*60.0

ademas, para imprimir valores flotantes con printf, se utiliza %f y no %g

Bueno, esos son los errores que note, ojala te sirva.

Saludos :)

NOTA:
==================================================================
Este foro es para ayudar, aprender, compartir... usenlo para eso,
NO SE RESUELVEN DUDAS POR MENSAJE PRIVADO Y MENOS POR CORREO
==================================================================

jokerm

  • Nuevo Miembro
  • *
  • Mensajes: 8
    • Ver Perfil
Re: Operacion con muchos digitos
« Respuesta #3 en: Sábado 26 de Marzo de 2011, 04:23 »
0
Si,  perdon esta mal la operacion pero igual, lo que quiero es hacer esta operacion simplemente
float segundos;

segundos = 24*7*3600

printf(¨Tenemos %f¨,segundos);


Pero el valor que imprime no es el correcto, ese es el problema

cltomas

  • Nuevo Miembro
  • *
  • Mensajes: 20
    • Ver Perfil
Re: Operacion con muchos digitos
« Respuesta #4 en: Sábado 26 de Marzo de 2011, 20:22 »
0
¿Y en que momento declaraste la variable segundo?...  No me entero muy bien, coloca el código que tienes... al primero le falt declarar segundo o segundos ....

jokerm

  • Nuevo Miembro
  • *
  • Mensajes: 8
    • Ver Perfil
Re: Operacion con muchos digitos
« Respuesta #5 en: Lunes 28 de Marzo de 2011, 03:51 »
0
HOla, mira este es mi codgio en concreto, lo corro y todo pero el valor que arroja no es correcto.

Uso windows y como compilador uso turbo c 3.5

Código: C
  1. #include <stdio.h>
  2.  
  3.  
  4.  
  5. void main()
  6.  
  7. {
  8.  
  9. float semana;
  10.  
  11.     clrscr();
  12.  
  13.     semana = (24*7*3600);
  14.  
  15.     printf("Son %f ",semana);
  16.  
  17.     getch();
  18.  
  19. }
  20.  

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: Operacion con muchos digitos
« Respuesta #6 en: Lunes 28 de Marzo de 2011, 09:22 »
0
A mí me funciona correctamente bajo Linux.

Código: C
  1. #include <stdio.h>
  2.  
  3. int main()
  4. {
  5.     float semana;
  6.     //clrscr();
  7.     semana = (24*7*3600);
  8.     printf("Son %f ",semana);
  9.     //getch();
  10.     return 0;
  11. }
  12.  

Código: Text
  1. $ gcc -o prueba prueba.c
  2. $ ./prueba
  3. Son 604800.000000
  4. $
  5.  
Así que el problema no es tu código, sino muy probablemente el compilador. No sé para qué sigues usando un compilador tan obsoleto como Turbo C 3.5.

cltomas

  • Nuevo Miembro
  • *
  • Mensajes: 20
    • Ver Perfil
Re: Operacion con muchos digitos
« Respuesta #7 en: Lunes 28 de Marzo de 2011, 16:43 »
0
A mí también me funciona bien y estoy en Debian Gnu/linux, te recomiendo que utilices gcc para windows, como dice m0skito debe ser problema del compilador... Saludos

ProfesorX

  • Moderador
  • ******
  • Mensajes: 796
  • Nacionalidad: mx
    • Ver Perfil
Re: Operacion con muchos digitos
« Respuesta #8 en: Lunes 28 de Marzo de 2011, 19:40 »
0
Bueno, yo agregare a lo que te contestaron una cosa, tu dices que el valor que obtienes no es el correcto, pero nunca mencionas cual es el resultado que obtienes, y cual resultado esperas obtener.

Porque como bien te dijeron antes, el resultado de esa multipilicacion es 604800.00, y ese es el mismo resultado que yo obtengo tambien, utilizando Visual C++ 2010, si ese resultado es el que obtienes, entonces es correcto, ya que nunca mencionas que resultado esperas obtener, ya en mi otro mensaje te pregunte si querias obtener semanas (dando los segundos) o segundos (dando las semanas), quizas esperabas otro resultado, en cuyo caso estas equivocado en cuanto a la manera de obtener el resultado que quieres, pero dado que nunca mencionas cual resultado esperas obtener, al final resulta que estamos adivinando el resultado que crees que deberias obtener ;)

Ahora, si no obtienes como resultado 604800.00 (cosa que dudo, pero no puedo comprobarlo, pues ya no uso Turbo C++), entonces si, muy probablemente se deba a que tu compilador es obsoleto, pero como dije antes, dudo mucho que no te de 604800.00, ya que la manera en que los compiladores almacenna los valores de tipo float no ha cambiado mucho.

Mi codigo, modificado para Visual C++ 2010
Código: C++
  1.  
  2. #define _CRT_SECURE_NO_WARNINGS
  3. #include <cstdio>
  4.  
  5.  
  6. int main()
  7. {
  8. float semana;
  9.  
  10.     semana = (24*7*3600);
  11.  
  12.     printf("Son %f ",semana);
  13.  
  14.     return 0;
  15.  
  16. }
  17.  

Saludos :)

NOTA:
==================================================================
Este foro es para ayudar, aprender, compartir... usenlo para eso,
NO SE RESUELVEN DUDAS POR MENSAJE PRIVADO Y MENOS POR CORREO
==================================================================

jokerm

  • Nuevo Miembro
  • *
  • Mensajes: 8
    • Ver Perfil
Re: Operacion con muchos digitos
« Respuesta #9 en: Martes 29 de Marzo de 2011, 07:55 »
0
SI concluyo que es el compilador, en gnu/linux si me arroja el resultado correcto. Y respecto a porque uso este compilador es debido a que el programa escolar marca usar el dichoso turbo c, y nuestra lucida maestra no sabe usar otro que no sea este, si no corre en turbo c esta mal.

Miren una captura del codigo en turbo c

"img576.imageshack.us/i/dibujoglt.jpg/"

Y la captura de la pantalla al correr el codigo en turbo c

"img695.imageshack.us/i/dibujo2bre.jpg/"

No se porque el resultado no es 604,800

PD: Las imagenes las pongo en link porque no tengo privilegios para ponerlas como se debe

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: Operacion con muchos digitos
« Respuesta #10 en: Martes 29 de Marzo de 2011, 09:48 »
0
Es problema del compilador, coméntaselo a tu profesora, que eso de compiladores corriendo en MS-DOS emulado pues como que ya no se lleva.

Y por cierto no es void main() sino int main(), también se lo puedes comentar a tu profesora, y que por favor se ciña a C estándar, que es lo que debe enseñar (díselo de mi parte). Que se compre este libro por favor: http://cm.bell-labs.com/cm/cs/cbook/

Saludos

cltomas

  • Nuevo Miembro
  • *
  • Mensajes: 20
    • Ver Perfil
Re: Operacion con muchos digitos
« Respuesta #11 en: Martes 29 de Marzo de 2011, 16:30 »
0
Yo te recomiendo este:
Código: C
  1. Como Programar en C .C++ Deitel.Prentice-Hall
  2.  
Esta muy bueno para los principiantes, yo he tirado de muchos libros a la vez, para ir aprendiendo, pero este creo que es uno de los mejores que he leido... El que recomienda m0skito es el mejor sin lugar a dudas, ya que es de los creadores del lenguajes, pero si ya sabes algo de prograamación...... saludos

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: Operacion con muchos digitos
« Respuesta #12 en: Martes 29 de Marzo de 2011, 16:46 »
0
Hombre su profesora de programación algo tiene que saber de programación, digo yo (aunque nunca se sabe...).

ProfesorX

  • Moderador
  • ******
  • Mensajes: 796
  • Nacionalidad: mx
    • Ver Perfil
Re: Operacion con muchos digitos
« Respuesta #13 en: Martes 29 de Marzo de 2011, 21:13 »
0
Bueno, estuve investigando, y parece que encontre la razon por la cual no te da el resultado correcto, y se debe a la conversion de tipos y al rango de los int en los diferentes compiladores.

En C++, cuando multiplicas enteros, el resultado de la multiplicacion es entero, y cuando multiplicas flotantes, el resultado es flotante.

Entonces, en la linea:

Código: C++
  1. semana = (24*7*3600);
  2.  

todos los factores son enteros, entonces el resultado de la multiplicacion es entero, pero ademas, en Turbo C++, los enteros (int) son de 16 bits, y el valor de un entero de 16 bits va de − 32,768 a 32,767, y dado que 604800 es una cantidad mucho mayor que la que puede ser almacenada en un entero de 16 bits, ocurre un desborde aritmetico (Arithmetic overflow) y por eso da ese numero. Luego cuando asignas el resultado a semana se convierte de int a float, pero ya es tarde, pues el numero quedo desbordado.

En Visual C++ y los otros compiladores no ocurre esto, debido a que los int en estos compiladores son de 32 bits, y su rango va de − 2,147,483,648 a 2,147,483,647, entonces 604800 queda dentro del rango y no hay desborde aritmetico. Pero si el resultado de la multiplicacion quedara fuera de ese rango, incluso en Visual C++ habria desbordamiento aritmetico (recuarda lo que dije, si multiplicas enteros, el resultado es entero, y si multiplicas flotantes, el resultado es flotante), y tambien daria un resultado incorrecto.

La solucion a este problema es declarar los factores explicitamente como flotantes, agregando un punto decimal a cada numero, como en el siguiente ejemplo:

Código: C++
  1. semana = (24.0*7.0*3600.0);
  2.  

Si en lugar de usar constantes, usas variables enteras, debes convertirlas explicitamente a flotantes, multiplicando cada variable por 1.0, para que se convierta a flotante, ojo, solo si la variable es entera, si la variable es flotante no es necesario, ejemplo:

Código: C++
  1. semana = (horas * 1.0) * (dias * 1.0) * (segundos * 1.0);
  2.  

Pruebalo asi, y me dices si ahora si te da el resultado correcto.

Saludos :)

NOTA:
==================================================================
Este foro es para ayudar, aprender, compartir... usenlo para eso,
NO SE RESUELVEN DUDAS POR MENSAJE PRIVADO Y MENOS POR CORREO
==================================================================

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: Operacion con muchos digitos
« Respuesta #14 en: Martes 29 de Marzo de 2011, 21:39 »
0
Muy buena explicación ProfesorX, gracias  :good:  :good:  :good:

jokerm

  • Nuevo Miembro
  • *
  • Mensajes: 8
    • Ver Perfil
Re: Operacion con muchos digitos SOLUCIONADO
« Respuesta #15 en: Miércoles 30 de Marzo de 2011, 01:24 »
0
Omg, sorprendido con la explicacion, le pregunte a mi profesora y me dijo que lo iba a checar ("desde hace 4 dias").

Muchas gracias a todos por ayudarme, y si efectivamente poniendo el valor como 3600.0  es decir con punto decimal para que sea flotante, el resultado de la operacion es correcta.

Profesorx, gracias por excelente explicacion haciendo honeres a tu nick, moskito estoy empezando a leer ese libro. Gracias por todo.

Saludos