Programación General > C/C++

 Operacion con muchos digitos

<< < (3/4) > >>

m0skit0:
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:
Yo te recomiendo este:

--- Código: C ---Como Programar en C .C++ Deitel.Prentice-Hall  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:
Hombre su profesora de programación algo tiene que saber de programación, digo yo (aunque nunca se sabe...).

ProfesorX:
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++ ---semana = (24*7*3600); 
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++ ---semana = (24.0*7.0*3600.0); 
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++ ---semana = (horas * 1.0) * (dias * 1.0) * (segundos * 1.0); 
Pruebalo asi, y me dices si ahora si te da el resultado correcto.

Saludos :)

m0skit0:
Muy buena explicación ProfesorX, gracias  :good:  :good:  :good:

Navegación

[0] Índice de Mensajes

[#] Página Siguiente

[*] Página Anterior

Ir a la versión completa