¿Qué es BigInt_lib?
BigInt_lib es una librería para trabajar con números de mucha precisión que a diferencia
de BigNum_lib usa los tipos definidos en la librería del
lenguaje F#.
Inicialmente empecé a crear la librería BigNum_lib con las mismas estructura que contiene esta
librería, de hecho las clases contienen casi las mismas funciones en ambas librerías.
¿Por qué he creado esta librería teniendo la otra?
(Iba a empezar diciendo "buena pregunta", ya que me ha venido a la cabeza lo que se suele hacer
en las charlas... ¿te has dado cuanta de que siempre que alguien hace una pregunta se suele decir
eso de "buena pregunta"?, je, je, siempre me rio de eso... no por nada, sino porque casi todos lo
que lo dicen lo dicen casi por decirlo y cuando realmente es una buena pregunta, pues ya no se sabe
si se dice por decir... en fin... cosas mías...)
Independientemente de que sea o no una buena pregunta, es una pregunta, y si además me la hago yo
mismo, pues lo lógico es que me responda para que yo ya sepa... lo que ya sé..., ¿entonces para que
me pregunto una cosa de la que yo ya sé la respuesta? Bueno, es que se supone que es para que tú te
hicieras esa pregunta al ver que tengo cosas parecidas.., ná, ni me hagas caso, que algunas veces
pues...
A ver... ¿por qué he creado esta librería si ya tengo la otra? pues... ¡porque sí! je, je, en
serio, es que la otra librería usa la DLL esa que he creado en C++ y esa DLL se puede usar sin
problemas en las aplicaciones de escritorio, pero por ejemplo, no la puedo usar en un sitio Web...
Bueno, usarla la puedo usar, pero tendría que "moverme" y hacer que la gente del servidor Web se
movieran y me registraran la librería y esas cosas... mientras que si uso la de F#, como está creada
en .NET pues no habrá que decirle nada a nadie, solo copiar el mega y medio que ocupa en el
directorio bin y a rular...
Además de que al usar la librería de F#, pues tendré oportunidades de usar otras cosas sin tener
que reinventar la rueda, que es lo que he tenido que hacer en algunos casos en las estructuras de la
otra librería.
En cualquier caso, casi con toda seguridad de que será esta librería la que siga manteniendo y
mejorando, salvo que la gente de F# se ponga "quisquillosa" y no permitan usar libremente esas
funciones...
Esta librería tiene definidas tres estructuras, según el tipo de números que quieras usar.
Nota:
Si quieres saber más sobre todo esto de los números explicado de forma muy clara, te recomiendo que
le eches un vistazo a la
sección sobre los números que mi colega May tiene en su sitio
TeladeAraña.
Esas estructuras son: BigInt, BigFloat y BigFrac. Todas ellas están
definidas en el espacio de nombres elGuille.Developer.FSharp, por tanto, para usarlas tendrás
que añadir una importación a ese espacio de nombres.
Aquí tienes una explicación breve de cada una
de ellas.
BigInt te permite trabajar con números enteros de gran precisión (es decir de muchísimas cifras).
Esta estructura usa por debajo la estructura BigInt definida en el espacio de nombres
Microsoft.FSharp.Math.
Implementa las mismas funciones que la estructura original además de algunas otras de mi cosecha.
Nota:
Esta estructura sería equivalente a BigNum de BigNum_lib.
Esta estructura te permite operar con números no enteros de coma flotante de mucha precisión.
Internamente se apoya en la estructura BigInt (la mía, no la de F#) y también llega a usar
BigFrac.
Debido a que puede llegar a trabajar casi con infinitos decimales, he creado una propiedad
compartida llamada MaxDecimales que permite indicar el número máximo de decimales a usar. Esa
propiedad en realidad está definida en la estructura BigInt, por tanto, cualquier cambio realizado a
esa propiedad en BigInt, afectará a esta estructura (y a BigFrac).
El valor predeterminado es de 30 cifras decimales, (que es el valor que usa la calculadora de
Windows) y el valor máximo que se le puede asignar es el indicado por el campo
MaxDecimalesMinValue (definido en BigInt) y que por defecto tiene el valor 1000, pero lo puedes
cambiar a la cantidad que quieras (y que soporte un entero de 32 bits, pero debes tener en cuenta
que cuantos más decimales manejes, más memoria se consumirá).
Nota:
Esta estructura sería equivalente a BigFloat de BigNum_lib,
pero no tiene equivalencia en la librería de F# (al menos en lo que contiene en la versión 1.9.2.9).
Esta estructura te permite operar con números fraccionarios (al estilo de 1/3) de gran precisión.
Internamente usa el tipo BigInt de esta misma librería y algunas operaciones las hace usando el
tipo BigNum de F#.
Léete lo que digo en la página explicativa sobre la simplificación de las fracciones.
Que los nombres no te confundan
Estas clases (estructuras) son parecidas a la de BigNum_lib, la diferencia principal es que
aquella librería usa el código de LibTomMath para trabajar con números enteros de gran precisión.
Las estructuras de esta librería (BigInt_lib) usan las estructuras BigInt y BigNum de F#.
En F#, la estructura BigInt es para números enteros de gran precisión, la estructura
BigNum de F# es para números fraccionarios de gran precisión.
En la librería BigInt_lib utilizo BigInt para los números enteros de gran
precisión, mientras que en la librería BigNum_lib el nombre que utilizo es BigNum que
no tiene nada que ver con el BigNum de F#.
Por tanto, (usando mis librerías), BigInt es lo mismo que BigNum, pero se
manejan internamente de forma diferente.
Tanto en BigNum_lib como en
BigInt_lib, uso los nombres BigFrac para números fraccionarios
y BigFloat para los números con decimales (punto flotante).
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 BigInt_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 BigInt_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.
En
el sitio de F# hay una nueva versión para Visual Studio 2008 (a fecha de
hoy 24 de Enero de 2009 es la versión 1.9.6.2 que se denomina September 2008
CTP), pues bien... esa nueva versión no sirve para usarla con mi código. La
última versión que me he bajado del sitio de F# y que si funciona es la
versión 1.9.4.19, que es la que utilizo en el código que he publicado con
fecha de hoy 24 de Enero de 2009.
El código fuente en formato proyecto
Aquí abajo tienes el link para bajarte el código de esta librería en formato de proyecto para
Visual Basic 2005 (el de la versión 1.0.0.27) y para Visual Basic 2008 (el
indicado como código más reciente).
Y si creas una utilidad o algo que use esta librería, pues me lo dices y lo mismo te pongo un
link .