¿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 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...
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.
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.