2017-05-23 7 views
0

Où obtenir des modules Biginteger et comment les importer dans visual basic qui fait partie de l'accès ms?Utiliser Biginteger dans VB

Je souhaite travailler avec des entiers (très) grands dans visual basic et éviter les débordements d'entiers. D'après certains rapports, il existe des modules Biginteger qui peuvent être utilisés pour cela, mais où les trouver et lesquels utiliser? Et, alors comment les importer dans mon environnement VB?

+0

Quelle est la taille d'un nombre? par exemple long = -2 147 483 647 à 2 147 483 647. Après que googling trouvé ce .... https: //visualstudiomagazine.com/articles/2011/01/25/biginteger.aspx – BobSki

+0

Peut System.Numerics de vb.net être importé/lié dans vb dans l'accès MS (ou Excel) dans Office 2016 en quelque sorte? – Maestro13

+0

Quelle est la taille du nombre – BobSki

Répondre

2

Je trouve un peu de code pour cela il y a très longtemps, ne me souviens pas d'où et se sont heurtées pas dans tout très long, mais voici:

Option Compare Database 
Option Explicit 
Public cDecMax As Variant, cDecMaxLen As Integer, cSqrDecMaxLen As Integer 

Function LargeAdd(ByVal Nbr1 As String, ByVal Nbr2 As String) As String 
    Initialize 
    If Len(Nbr1) <= cDecMaxLen And Len(Nbr2) <= cDecMaxLen Then 
     LargeAdd = CStr(CDec(Nbr1) + CDec(Nbr2)) 
     Exit Function 
     End If 
    If Len(Nbr1) > cDecMaxLen Then LargeAdd = addByParts(Nbr1, Nbr2) _ 
    Else LargeAdd = addByParts(Nbr2, Nbr1) 
End Function 

Function LargeMult(ByVal Nbr1 As String, ByVal Nbr2 As String) As String 
    Initialize 
    If Len(Nbr1) <= cSqrDecMaxLen And Len(Nbr2) <= cSqrDecMaxLen Then 
     LargeMult = CStr(CDec(Nbr1) * CDec(Nbr2)) 
     Exit Function 
    End If 
    If Len(Nbr1) > cSqrDecMaxLen Then 
     LargeMult = factorOneNbr(Nbr1, Nbr2) 
    Else 
     LargeMult = factorOneNbr(Nbr2, Nbr1) 
    End If 
End Function 

Public Sub Initialize() 
    Static Initialized As Boolean 
    If Initialized Then Exit Sub 
    Initialized = True 
    cDecMax = _ 
     CDec(Replace("79,228,162,514,264,337,593,543,950,335", ",", "")) 
      'this is 2^96-1 
    cDecMaxLen = Len(cDecMax) - 1 
    cSqrDecMaxLen = cDecMaxLen \ 2 
End Sub 

Private Function addByParts(ByVal Nbr1 As String, ByVal Nbr2 As String) As String 
    Dim NbrChunks As Integer 
    If Len(Nbr1) > Len(Nbr2) Then _ 
     Nbr2 = String(Len(Nbr1) - Len(Nbr2), "0") & Nbr2 _ 
    Else _ 
     Nbr1 = String(Len(Nbr2) - Len(Nbr1), "0") & Nbr1 
    NbrChunks = Ceil(Len(Nbr1)/cDecMaxLen) 
    Dim i As Integer, OverflowDigit As String, Rslt As String 
    OverflowDigit = "0" 
    For i = NbrChunks - 1 To 0 Step -1 
     Dim Nbr1Part As String 
     Nbr1Part = Mid(Nbr1, i * cDecMaxLen + 1, cDecMaxLen) 
     Rslt = CStr(CDec(Nbr1Part) _ 
      + CDec(Mid(Nbr2, i * cDecMaxLen + 1, cDecMaxLen)) _ 
      + CDec(OverflowDigit)) 
     If Len(Rslt) < Len(Nbr1Part) Then 
      Rslt = String(Len(Nbr1Part) - Len(Rslt), "0") & Rslt 
      OverflowDigit = "0" 
     ElseIf i = 0 Then 
     ElseIf Len(Rslt) > Len(Nbr1Part) Then 
      OverflowDigit = Left(Rslt, 1): Rslt = Right(Rslt, Len(Rslt) - 1) 
     Else 
      OverflowDigit = "0" 
      End If 
     addByParts = Rslt & addByParts 
    Next i 
End Function 

Private Function factorOneNbr(ByVal LargeNbr As String, ByVal Nbr2 As String) As String 
    Dim NbrChunks As Integer, i As Integer, _ 
     Nbr1Part As String, PowersOf10 As Integer, _ 
     Rslt As String, FinalRslt As String 
    FinalRslt = "0" 
    NbrChunks = Ceil(Len(LargeNbr)/cSqrDecMaxLen) - 1 
    For i = NbrChunks To 0 Step -1 
     Nbr1Part = Mid(LargeNbr, i * cSqrDecMaxLen + 1, cSqrDecMaxLen) 
     Rslt = LargeMult(Nbr1Part, Nbr2) 
     FinalRslt = LargeAdd(FinalRslt, Rslt & String(PowersOf10, "0")) 
     PowersOf10 = PowersOf10 + Len(Nbr1Part) 
    Next i 
    factorOneNbr = FinalRslt 
End Function 

Function Ceil(x As Single) As Long 
    If x < 0 Then Ceil = Fix(x) Else Ceil = -Int(-x) 
End Function 

Aussi juste trouvé cet http://www.excel-ticker.com/calculation-of-very-large-numbers-in-excel-part-4-exponentiation/

+0

Fonctionne toujours et assez utile - donc je vais essayer les choses! Merci. – Maestro13

+0

J'ai changé le code pour répondre à mes normes et amélioré avec la soustraction - ce que vous avez fourni était un bon plomb - thx – Maestro13