11111010111 1010 1011

Programar por Programar


¿Te gusta programar?
Inicio


BigNum: Estructura para números enteros de gran precisión

Estructura en Visual Basic 2005 que usa BigNum_ltm.dll


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

Publicidad

elGuille.Hosting, seguramente los mejores precios de alojamiento


 

Contenido

Esta es la estructura hecha en Visual Basic 2005 que usa las funciones definidas en BigNum_ltm.dll

La forma de declarar esas funciones está al estilo de VB6, es decir, usando Declare, para que te resulte más fácil convertirla a Visual Basic 6.0.

Por ejemplo, para definir el método que convierte de una cadena a un BigNum, tendrás que usar algo como esto:

Public Declare Function BigNumFromString Lib "BigNum_ltm.dll" (ByVal s As String) As BigNum

En el fichero con el código fuente de BigNum.vb puedes ver todas las definiciones de las funciones de la librería de C++ y cómo usar algunas de esas funciones, algunas de ellas están definidas como Shared (compartidas, static en C#) y otras son de instancia, es decir, se basan en el objeto BigNum actual.

 

Nota:
De esta estructura (BigNum) así como BigFloat (el equivalente para números con decimales) está en una DLL compilada con .NET Framework 2.0, por tanto, podrás usarla con cualquier lenguaje que soporte el .NET 2.0).

 

Cómo usar la estructura BigNum (ejemplos de uso)

Para usar esta estructura, lo harás como cualquier otra, debes tener en cuenta, que si usas Visual Basic 2005 (o superior) o C#, podrás usar las sobrecargas de los operadores.

Para usar este tipo de datos tendrás que crear una importación al espacio de nombres en el que está definida la estructura, que si usas la DLL con el código compilado, será: elGuille.Developer.LibTomMah.

Imports elGuille.Developer.LibTomMath

using elGuille.Developer.LibTomMath;

 

Ejemplo de uso para Visual Basic 2005:

Dim bn1, bn2 As BigNum
Dim bn3 As BigNum

bn1 = 12345
bn2 = 567890123456789

bn3 = bn1 * bn2
Console.WriteLine("{0} * {1} = {2}", bn1, bn2, bn3)

' debido a que está sobrecargada la conversión desde String
' puedes hacer algo como esto:
bn1 = "1234567890123456789012345678901234567890"
' ya que el IDE no te dejaría hacerlo así:
'bn1 = 1234567890123456789012345678901234567890

' Ni algo como esto:
bn2 = "9999888877776666555544443333222211110000999888777666555444333222111000" & _
      "998877665544332211009876543210"
bn3 = bn1 * bn2
Console.WriteLine("{0} * {1} = {2}", bn1, bn2, bn3)

Estas líneas de código producirían el siguiente resultado:

12345 * 2147483648 = 26510685634560
1234567890123456789012345678901234567890 * 9999888877776666555544443333222211110 000999888777666555444333222111000998877665544332211009876543210 = 12345541713305 76129204264733632497680483975545689124690345553196170332097393550316735241167438 5446430854223695100525140318133322111263526900

Se supone que esas operaciones están bien... aunque no lo he comprobado manualmente... ;-)))

 

Ejemplo de uso para C# 2.0

BigNum bn1, bn2, bn3;

bn1 = 12345;
bn2 = 567890123456789;

bn3 = bn1 * bn2;
Console.WriteLine("{0} * {1} = {2}", bn1, bn2, bn3);

// debido a que está sobrecargada la conversión desde String
// puedes hacer algo como esto:
bn1 = "1234567890123456789012345678901234567890";
// ya que el IDE no te dejaría hacerlo así:
//bn1 = 1234567890123456789012345678901234567890;

// Ni algo como esto:
bn2 = "9999888877776666555544443333222211110000999888777666555444333222111000" + 
      "998877665544332211009876543210";
bn3 = bn1 * bn2;
Console.WriteLine("{0} * {1} = {2}", bn1, bn2, bn3);

 

Como puedes apreciar en el código anterior, si vas a trabajar con números muy, muy grandes, tendrás que usar la sobrecarga que convierte de cadena a un BigNum, (o usar el método Parse), también puedes definir sobrecargas del constructor (método New) que acepte parámetros de tipo String y/o Integer (seguramente los añadiré, ya que pensaba que los tenía definidos).

En cualquier caso, las conversiones definidas en la estructura, permiten convertir a BigNum desde String y Double, aunque en este caso, se convierte a entero (Int32). Al existir la conversión desde Double, cualquier otro tipo numérico también se convertirá automáticamente, pero recuerda que antes se pasa a Integer, por tanto, puede existir un desbordamiento.

 


El código fuente y la DLL de BigNum: BigNum_lib_src.zip - 40.4 KB

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

(MD5 checksum: 83E7069962DB428B36BAEB4A461EAE56)


Links relacionados 

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 www.programarporprogramar.org