VB .NET - Tipo de dados BigInteger


Se você precisa trabalhar com números inteiros absurdamente grandes os tipos de dados Integer e Long talvez não suportem o intervalo numérico com o qual você precisa tratar.

O tipo de dados Long trata números inteiros(8 byte) de 64 bit cujo valor varia de -9.223.372.036.854.775.808 até de 9.223.372.036.854.775.807 (9.2... E+18).
  • O tipo correspondente no .NET Framework é a estrutura System.Int64;
  • Você pode converter um tipo de dados Long para Decimal, Single ou Double sem ocorrer em um OverflowException;

O tipo de dados Integer armazena inteiros de 32 bits (4-byte) com sinal que variam em valor de -2,147,483,648 a 2,147,483,647.

  • O tipo de dados Integer proporciona um desempenho ideal em um processador de 32 bits. Os outros tipos integrais são mais lentos para carregar e armazenar na memória;
  • O tipo correspondente no .NET Framework é a estrutura System.Int32;
  • Você pode converter um tipo de dados Integer para Long, Decimal, Single ou Double sem ocorrer em um OverflowException;

Neste caso você pode usar o novo tipo de dados BigInteger disponível a partir da versão 4.0 da plataforma .NET no namespace System.Numerics.

Obs: Você tem que incluir uma referência no seu projeto a System.Numerics e depois usar a declaração Imports System.Numerics;

O tipo de dados BigInteger é um tipo imutável que representa um integer arbitrariamente grande cujo valor teoricamente não tem limite superior ou inferior.

"O tipo BigInteger é um tipo imutável que representa um inteiro arbitrariamente grande, cujo valor, em teoria, não tem limites superiores ou inferiores. Os membros do tipo BigInteger são intimamente paralelos aos de outros tipos integrais (o Byte, Int16, Int32, Int64, SByte, UInt16, UInt32, e os tipos UInt64). Esse tipo difere dos outros tipos integrais na plataforma .NET, que têm um intervalo indicado pelas suas propriedades MinValue e MaxValue."

Como tipo BigInteger é imutável e como ele não possui limites superiores ou inferiores, uma exceção do tipo OutOfMemoryException pode ser lançada para qualquer operação feita com um valor BigInteger que exceda a capacidade de memória.

A imutabilidade de BigInteger : Como o tipo de dados BigInteger é imutável você deve tomar cuidado ao realizar certas operações
que podem afetar o desempenho da sua aplicação.

Assim o código abaixo :

Dim a As BigInteger = 1
a += 1
Irá resultar na criação de um segundo objeto BigInteger; o que é totalmente transparente para você mas pode afetar seu desempenho.

Você pode usar a palavra chave new e fornecer qualquer valor integral ou de ponto flutuante como um parâmetro para o construtor BigInteger.(Valores de ponto flutuante são truncados antes de serem atribuídos a BigInteger.). Ex:

Dim bigIntFromDouble As New BigInteger(179032.6541)
Console.WriteLine(bigIntFromDouble)
Dim bigIntFromInt64 As New BigInteger(934157136952)
Console.WriteLine(bigIntFromInt64)
O resultado será:
       179032
       934157136952

Você pode declarar uma variável BigInteger e atribuir um valor como faria com qualquer tipo numérico, desde que o valor seja um tipo integral. O exemplo a seguir usa a atribuição para criar um valor BigInteger a partir de um Int64.

Dim valorLong As Long = 6315489358112
Dim bigIntFromLong As BigInteger = valorLong
A saida será: 6315489358112

Você pode usar uma instância de BigInteger como usaria qualquer outro tipo de dados.

O BigInteger sobrecarrega os operadores numéricos padrão para que você possa realizar operações matemáticas básicas, como adição, subtração, divisão, multiplicação, subtração, negação e negação de unário.

Você também pode usar os operadores numéricos padrão para comparar dois valores BigInteger entre si.

Para idiomas que não oferecem suporte a operadores personalizados, a estrutura BigInteger também fornece métodos equivalentes para realizar operações matemáticas.(Ex: Add, Divide, Multiply, Negate, Subtracte muitas outras)

O BigInteger possui muitos métodos estáticos, tais como o Parse(), TryParse(), e ToString() (que também suporta o formato hexadecimal) encontrados em outros tipos de números inteiros, bem como ajudantes matemáticos, tais como Pow(), log(), Log10(), e outros.

Para mostrar a força e o tamanho de um BigInteger vamos criar uma aplicação usando o Visual Basic 2010 Express Edition do tipo Windows Forms com o nome BigInteger_VBNET;

No formulário padrão form1.vb vamos incluir alguns controles Label, TextBox e Button e definir o leiaute conforme a figura abaixo:

Após isso no menu Project clique em Add Reference e na aba .NET selecione o item System.Numerics e clique em OK;

O código do formulário acima pode ser visto a seguir:

Imports System.Numerics

Public Class Form1

    Dim N1 As Integer
    Dim N2 As BigInteger
    Dim N3 As BigInteger
    Dim N4 As BigInteger
    Dim N5 As BigInteger
    Dim N6 As BigInteger

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        N1 = UInt16.MaxValue
        N2 = UInt32.MaxValue
        N3 = UInt64.MaxValue
        txtNum1.Text = N1.ToString
        txtNum2.Text = N2.ToString
        txtNum3.Text = N3.ToString
    End Sub

    Private Sub btnCalcular_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnCalcular.Click
        Try
            N4 = N3 + N3
            N5 = N3 * N3
            N6 = BigInteger.Pow(N3, 999)
            txtNum4.Text = N4.ToString
            txtNum5.Text = N5.ToString
            txtNum6.Text = N6.ToString

        Catch memex As OutOfMemoryException
            MsgBox(" Erro : " + memex.Message)
        Catch ovex As OverflowException
            MsgBox(" Erro : " + ovex.Message)
        Catch ex As Exception
            MsgBox(" Erro : " + ex.Message)
        End Try
    End Sub

End Class

Executando o projeto teremos o seguinte resultado:

Considerações sobre o código:

Observe o valor obtido na operação BigInteger.Pow(N3, 999) que eleva o número 18446744073709551615 a potência 999.

Realmente é um número integral muuuuuuuuuuuuuuuuuuito grande.

Note também que eu estou tratando as exceções : OutOfMemoryException e OverflowException antes do tratamento geral Exception.

Para usar o recurso no .NET Framework 3.5 você pode tentar fazer o seguinte:
Vá para a página de propriedades do projeto para seu projeto e adicione uma referência para o arquivo vjslib.dll.
Isso irá adicionar uma referência para as bibliotecas Java incluídas no .NET como parte da linguagem J#.
Nessa biblioteca você vai encontrar a estrutura BigInteger.
(Eu pessoalmente não testei essa opção)

Pegue o projeto completo aqui: BigInteger_VBNET.zip

1Ts 3:9 Pois, que ação de graças podemos render a Deus por vós, por todo o gozo com que nos regozijamos por vossa causa diante do nosso Deus,

1Ts 3:10 rogando incessantemente, de noite e de dia, para que possamos ver o vosso rosto e suprir o que falta à vossa fé?

1Ts 3:11 Ora, o próprio Deus e Pai nosso e o nosso Senhor Jesus nos abram o caminho até vós,

1Ts 3:12 e o Senhor vos faça crescer e abundar em amor uns para com os outros e para com todos, como também nós abundamos para convosco;

1Ts 3:13 para vos confirmar os corações, de sorte que sejam irrepreensíveis em santidade diante de nosso Deus e Pai, na vinda de nosso Senhor Jesus com todos os seus santos.

Referências:


José Carlos Macoratti