Cómo manejar números grandes

por:

Cómo manejar números grandes

Una duda que nos plantearon hace algún tiempo, es la problemática de operar con números grandes en C, aunque este acercamiento también es válido para otros lenguajes. Lo primero de todo decir que cuando hablamos de números grandes debemos definir el número de cifras con las que consideramos que el número es grande.

Conociendo el número más grande que podemos almacenar en un tipo de dato

Un modo bastante simple, para acercarnos a este problema es ver cual es el mayor número que podemos almacenar en un tipo de dato. Aquí hay que hacer distinciones, por una parte si hablamos de números reales y por otra si hablamos de números enteros.

En el caso de números enteros, por ejemplo si nuestro tipo de dato es un entero de 32bits, y acepta números tanto positivos como negativos, el mayor número que puede almacenar es: 2^31 -1 = 2.147.483.647. Si queremos almacenar números más grandes, y no vamos a utilizar los negativos, podemos usar un entero de 32bits sin signo. En este caso tenemos que el mayor número es el 2^32 -1 = 4.294.967.295

El siguiente paso para poder manejar números más grandes, es bastante obvio y consiste en aprovechar las máquinas de 64bits, utilizando enteros de 64bits. Pudiendo almacenar como máximo el número 18.446.744.073.709.551.615.

Los tipos de datos reales, utilizan otra representación que podéis ver aquí.

Cómo manejar números todavía más grandes

En algunos casos, como en las aplicaciones que utilizan algoritmos de criptografía, se necesita utilizar números extremadamente grandes. En estos casos encontramos dos soluciones:

  • Utilizar números reales para guardar números enteros, si la precisión no es importante para nosotros.
  • Utilizar “Enteros Grandes”, para no perder precisión.

Los Enteros Grandes son un tipo de datos, que no pertenecen a los tipos de datos del lenguaje, pero los podemos encontrar en muchas librerías (principalmente en las de criptografía), estos enteros grandes nos permiten utilizar enteros que ocupan cientos de bits, por ejemplo enteros de 2048 bits para generar certificados. Como os podéis imaginar las operaciones se han tenido que programar de manera distinta, para por un lado agilizar los cálculos y por otro no desbordar los registros y/o buffers del sistema.

En el caso de que uséis C, podéis utilizar la implementación de OpenSSL.

En el caso de que uséis Java, podéis utilizar la clase BigInteger, que en este caso sí pertenece al JDK.

Espero que este artículo os haya gustado. Saludos.

Deja una Respuesta