11111010111 1010 1011

Programar por Programar


¿Te gusta programar?
Inicio

BigNum - usando LibTomMath

 

Sección sobre números de gran precisión que usan LibTomMath

BigNum, BigFloat y BigFrac usando LibTomMath

Estoy haciendo cambios a las clases de esta DLL y
también publicaré otra librería que usa los tipos de F#

 

Publicado: 18/Oct/2007
Actualizado: 23/oct/2007
Autor: Guillermo 'guille' Som


 

¿Qué es BigNum_lib?

BigNum_lib es una librería para trabajar con números de mucha precisión (es decir, de muuuuchos dígitos).

Esta librería contiene actualmente varias estructuras cada una de ellas para trabajar con diferentes tipos de números.

Recomendación:
Si quiere saber más cosas sobre los números, te recomiendo que te leas la serie de artículos sobre los números que mi colega May tiene publicados en su sitio TeladeAraña.  ¡No tienen desperdicio!

 

A fecha de hoy 22 de Octubre, los tipos que he creado son estos tres: BigNum, BigFloat y BigFrac a continuación te explico qué es lo que hacen cada uno de esos tipos.
Si quieres ver más detalle de cada estructura, además de ver el código fuente y conseguir el proyecto completo.

 

Nota sobre las actualizaciones:

Debido a que las páginas Web se mantienen en caché, es posible que algunas de las actualizaciones que publique no las veas de forma inmediata, por tanto te recomiendo que te bajes el código fuente con la librería (y la librería en formato compilado), así seguro que siempre tendrás lo último que haya publicado.

También quiero decirte que debido a que es posible que haga cambios mínimos en el código esos cambios es posible que no los publique de forma inmediata, aunque si que iré actualizando el código de la librería, en esa librería estará el código más actual, por tanto, te recomiendo que te la descargues y mires ese código.

 

BigNum

BigNum es una estructura para trabajar con números enteros de gran precisión, es decir, que permiten trabajar con muchos dígitos, en teoría el límite de la cantidad de dígitos la impondrá el propio sistema operativo... no sabría decirte cual es el máximo, aunque he probado con cantidades superiores a los 300 dígitos y "parece" que van bien...

 

BigFloat

También he desarrollado una estructura para trabajar con números con decimales que se basa en BigNum para manejar los valores. A esa estructura la he llamado BigFloat.

A fecha de hoy 22 de Octubre, esta estructura está prácticamente terminada y comprobada.
Lo que es posible que haga es añadir nueva funcionalidad o mejorar la existente.

 

BigFrac

La tercera estructura que contiene esta librería es BigFrac, esta trabaja con números fraccionarios, es decir, números que se representan en la forma de 1/3 en lugar de 0.333333 (eso es lo que hace BigFloat).

Esta estructura la basé inicialmente en un código de Java (sí, es que es lo único que encontré en la red que fuese fácilmente comprensible por mi mente no preparada par las matemáticas, por desgracia no me encontré los artículos de May que te comenté al principio, que seguro que me hubieran aclarado muchas cosas, je, je).

Como te decía, el código de BigFrac está "inspirado" en el de la clase Fracción escrita en Java, aunque en la clase original usa números enteros (int) y en mi versión para Visual Basic 2005 usa la clase BigNum que tiene mucha más precisión.
Aquí tienes el link a esa página:
http://www.sc.ehu.es/sbweb/fisica/cursoJava/fundamentos/estatico/fraccion/fraccion.htm 

 

Espero que todo esto te resulte útil para poder trabajar con número grandes aunque debo decirte que estoy haciendo (hoy mismo la publico), otra librería (BigInt_lib) que también usa estos tres tipos de datos, pero que internamente usan las clases definidas en F#, particularmente usan la librería fslib.dll de F# en la versión 1.9.2.9 que es algo diferente a la que probé hace un año cuando "intenté" crear la estructura BigNum a partir de las clases de F#, pero la verdad es que... en fin... no sabía cómo atacar los números decimales... ya que esa librería no define ningún número con decimales "flotantes", pero verás que las versiones de BigFloat los manejan muy "requetebien" (es que no tengo abuela, je, je).

Aquí tienes el link a la página principal de la librería BigInt.

 

Si quieres ayudar a mejorar esta librería

Pues eso, que cualquier ayuda, sobre todo para mejorar los fallos que encuentres o para mejorar el rendimiento de lo que ya hay, siempre será bienvenida, así que... si quieres ayudar, pues... te lees este recuadro.

¿Cómo ayudar con BigNum_lib?

Puedes escribirme a mi cuenta de mensaje en mundoprogramacion.com, que por ahora no tengo configuradas las cuentas de este sitio.

En el asunto pones algo como "Ayuda con el código de BigNum_lib".

Por favor, explica bien el motivo, es decir, si es para comentar un fallo o una mejora, y si me proporcionas las cifras que has usado en las pruebas, pues mejor que mejor.

Gracias.

 

El código fuente en formato proyecto

Si te quieres bajar el código fuente de esta librería, en la página de la estructura BigNum tienes el link.

 


Explicación original (del 18 de Octubre de 2007) sobre la estructura BigNum que fue la primera que dejé totalmente operativa.

Como sabrás, .NET no dispone de librerías para trabajar con números que necesitan mucha precisión o que vayan a trabajar con números, por ejemplo de 200 cifras.

Lo más parecido que se puede usar en .NET para trabajar con números grandes es por medio del lenguaje F#, pero la verdad es que no he llegado a hacer demasiadas pruebas, lo mismo cualquier día de estos lo pruebo y cambio todo esto que te voy a mostrar hoy.

BigNum lo he creado en Visual Basic 2005 como una estructura de ese mismo nombre. Esa estructura tiene varios miembros de instancia y otros tantos que están compartidos (estáticos que llaman la gente de C). También tiene sobrecarga para los operadores más habituales y para realizar ciertas conversiones entre tipos. En cualquier caso, el uso de las sobrecargas de los operadores es opcional, y siempre se podrán usar los métodos que hay para cada una de esas operaciones.

La estructura BigNum en realidad usa una DLL creada en C++ y está compilada con Borland C++ 5.5 que es gratuito.

Esa librería de C++ (BigNum_ltm.dll) a su vez utiliza un fichero .lib que es el que en realidad hace todo el trabajo.
Esa librería (libtommath.lib) está creada a partir del código libre de la librería LibTomMath de Tom St Denis.

En las páginas de esta sección te mostraré lo que yo he hecho, es decir, la DLL en C++ y la estructura de VB.

También te mostraré el código de cómo compilar la librería a partir del código fuente de LibTomMath, (actualmente estoy usando la versión 0.41), así como los links para obtener ese código fuente.

La librería de C++ en realidad es un "wrapper" para acceder a la librería original y la estructura en realidad usa esa DLL de C++ pero añadiendo métodos para que resulte fácil usarla.

Con los links que tienes en esta página puedes descargar el código fuente de LibTomMath, compilarlo, bajarte el código de mi DLL de C++, compilarla y usarla desde cualquier compilador que utilice las DLL de Windows.

 


Programar por programar... ¡porque te gusta programar!
Ir al índice principal
Ir al sitio del Guille - Ir a los foros del Guille

Has entrado usando el host programarporprogramar.org