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.