<%@ Page masterpagefile="~/programarpor.master" language="VB" title="Índice de la sección BigInt usando la librería de FSharp" %>

BigInt - usando F#

 

Sección sobre números de gran precisión que usan las librerías de FSharp

BigInt, BigFloat y BigFrac en programar x programar

 

Publicado: 22/Oct/2007
Actualizado: 24/ene/2009
Autor: Guillermo 'guille' Som
 

Contenido:


Acerca de números de gran precisión que usan F#

¿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

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.

 

BigFloat

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

 

BigFrac

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.

 

Sobre la versión de F# usada en esta librería

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 guiño.

 


El código de la librería BigInt_lib

Este es el código más reciente:

El código fuente y la DLL de BigInt_lib: BigInt_lib_src.zip - 57.1 KB

Incluye el código fuente de BigNum, BigFloat y BigFrac además de la DLL compilada elGuille.BigInt.dll v1.0.1.33

(MD5 checksum: 5997ABA5FD94C856B2316E6EFF61B485)

Este proyecto referencia a FSharp.Core versión 1.9.4.19 localizada en: E:\FSharp-1.9.4.19\bin\FSharp.Core.dll

 

Este es el código anterior:

El código fuente y la DLL de BigInt_lib: BigInt_lib_src_ant.zip - 58.4 KB

Incluye el código fuente de BigNum, BigFloat y BigFrac además de la DLL compilada elGuille.BigInt.dll v1.0.0.27

(MD5 checksum: B26DC35CB44CC6AE95333E4C624ED751)