[C con Clase] Ayuda con programa tengo error

Steven Davidson srd4121 en njit.edu
Lun Sep 26 03:02:47 CEST 2011


Hola José Luis,

2011/9/25 jose luis <jcmdustin en gmail.com>:
> Hola, mi nombre es jose luis, ase unos dias un amigo me pidio q le ayude con un problema, el cual recivia un numero positivo y te mostraba el cuadrado y cubo respectivamente, no tuve probelmas en ayudarlo... lo que susedio luego es q el coloco el nuero 2000, como provaando, y empezaron a salir valores negativos...
> me pregunto por que salian esos valores, si el numero q ingrese era positivo, no supe que responderte... si alguno de ustedes me pudiese ayudar con esta duda, se lo agradeceria mucho.
>

El problema es que usas 'int', que seguramente ocupa 32 bits en tu
máquina. De estos 32 bits, el más significativo representa el signo: 1
es negativo y 0 es positivo. Esto significa que el intervalo de
valores representados por 'int' es el siguiente:
[-2147483648,+2147483647].

Al calcular el cubo de 2000, obtenemos el resultado de 8000000000.
Esto rebasa el valor máximo representado por 'int'. La secuencia de
bits para representar este número es la siguiente:

111011100110101100101000000000000

Pero sólo podemos guardar 32 bits, así que se recorta, y obtenemos,

 11011100110101100101000000000000

Este valor, interpretado por 'int', es el siguiente en decimal:

-589934592

Tienes dos soluciones:

1. Restringir el intervalo de valores válidos para tu programa, que
sería: [1,1290].

2. Usar otro tipo entero para guardar mayores cantidades. Por ejemplo,
'unsigned long long int', que seguramente ocupará 64 bits y además, al
ser 'unsigned', no se reserva un bit para el signo, porque se supone
que es positivo. Así, podemos trabajar con el siguiente intervalo:
[0,+18446744073709551615]. Para el número de 2000, nos sirve.

Sin embargo, para otras cantidades, no nos sirve este tipo de dato.
Por lo tanto, deberíamos echar mano a uno de coma flotante, aunque
signifique que en algunos casos perderemos información relacionada con
los dígitos menos significativos. Por ejemplo, si elegimos 'double',
nos saldrá lo siguiente para 2000:

2000     4e+06          8e+09

La parte significativa se guarda sin problemas, pero no los dígitos
menos significativos (centenas, decenas, unidades).

Si necesitas la información completa, sin pérdida, y que sea un número
entero de cualquier tamaño, entonces me temo que tendrás que echar
mano a otras bibliotecas que manejen números grandes. Claro que nadie
te detiene para que los crees tú mismo :)

> dejo el programa en el q ingresamos el numero...
>
> #include<iostream>
> #include <iomanip.h>

Esto es un error y sólo existe por motivos de compatibilidad; debería ser:

#include <iomanip>


Espero haber aclarado el tema.

Steven




Más información sobre la lista de distribución Cconclase