vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
Schützen Sie Ihre Software vor Software-Piraterie - mit sevLock 1.0 DLL!  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2024
 
zurück

 Sie sind aktuell nicht angemeldet.Funktionen: Einloggen  |  Neu registrieren  |  Suchen

VB.NET - Ein- und Umsteiger
Re: Rechnen mit sehr großen Zahlen 
Autor: Aicher1998
Datum: 29.05.14 14:08

Hallo
bin neu hier und kenn mich noch nicht so aus.
Ich verwende Microsoft Visual Basic 2010 Express-
Kann BigInteger denn auch Zahlen auffassen, di Länger sind als dr Arbeitsspeicher??
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Rechnen mit sehr großen Zahlen 
Autor: Aicher1998
Datum: 29.05.14 10:22

Hallo
ich hab da mal ein kleines Provlem.
Ich müsste mit sehr langen Zahlen rechnen (über 100.000 Stellen).
Hab mir deshalb einiges zusammengesucht und um vb.net umgeschrieben.
Allerdings werden keine Komma-Stellen unterstützt.
Mein Code bisher ist folgender:

 
Module MATHs
    Public Function LTrim0(ByVal strVar As String) As String
        Do Until Len(strVar) = 1 Or Left$(strVar, 1) <> "0"
            strVar = Mid$(strVar, 2)
        Loop
        LTrim0 = strVar
    End Function
 
    Public Function Add(ByVal strNo1 As String, ByVal strNo2 As String) As _
      String
        Dim bytSum As Byte
        Dim bytCarry As Byte
        Dim lngMax As Long
        Dim lngVar As Long
        Dim strSum As String = ""
 
        strNo1 = LTrim0(strNo1)
        strNo2 = LTrim0(strNo2)
        lngMax = IIf(Len(strNo1) > Len(strNo2), Len(strNo1), Len(strNo2))
        strNo1 = Right$(New String("0", lngMax) & strNo1, lngMax)
        strNo2 = Right$(New String("0", lngMax) & strNo2, lngMax)
        For lngVar = Len(strNo1) To 1 Step -1
            bytSum = Val(Mid$(strNo1, lngVar, 1)) + Val(Mid$(strNo2, lngVar, _
              1)) + bytCarry
            strSum = bytSum Mod 10 & strSum
            bytCarry = bytSum \ 10
        Next lngVar
        If bytCarry Then strSum = bytCarry & strSum
 
        Return strSum
    End Function
 
    Public Function Divide(ByVal strNo1 As String, ByVal strNo2 As String) As _
      String
        Dim bytQuo As Byte
        Dim lngVar As Long
        Dim strQuo As String = ""
        Dim strDiv As String = ""
        Dim strVar As String = ""
 
        strNo1 = LTrim0(strNo1)
        strNo2 = LTrim0(strNo2)
        lngVar = Len(strNo2)
        strDiv = Left$(strNo1, lngVar)
        Do While lngVar <= Len(strNo1)
            strVar = Subtract(strDiv, strNo2)
            bytQuo = 0
            Do While Left$(strVar, 1) <> "-"
                bytQuo = bytQuo + 1
                strVar = Subtract(strVar, strNo2)
            Loop
            strQuo = strQuo & CStr(bytQuo)
            lngVar = lngVar + 1
            strDiv = Subtract(strNo2, Mid$(strVar, 2)) & Mid$(strNo1, lngVar, 1)
        Loop
 
        Return LTrim0(strQuo)
    End Function
 
    Public Function Modulo(ByVal strNo1 As String, ByVal strNo2 As String) As _
      String
        Return Subtract(strNo1, Multiply(strNo2, Divide(strNo1, strNo2)))
    End Function
 
    Public Function Multiply(ByVal strNo1 As String, ByVal strNo2 As String) As _
      String
        Dim bytPrd As Byte, bytCarry As Byte
        Dim lngVar1 As Long, lngVar2 As Long
        Dim strPrd As String, strVar As String
 
        strNo1 = LTrim0(strNo1)
        strNo2 = LTrim0(strNo2)
 
        If Len(strNo1) > Len(strNo2) Then
            strVar = strNo1
            strNo1 = strNo2
            strNo2 = strVar
        End If
 
        strPrd = "0"
 
        For lngVar1 = Len(strNo1) To 1 Step -1
            strVar = New String("0", Len(strNo1) - lngVar1)
            bytCarry = 0
            For lngVar2 = Len(strNo2) To 1 Step -1
                bytPrd = Mid$(strNo1, lngVar1, 1) * Mid$(strNo2, lngVar2, 1) + _
                  bytCarry
                strVar = bytPrd Mod 10 & strVar
                bytCarry = bytPrd \ 10
            Next lngVar2
            If bytCarry Then strVar = bytCarry & strVar
            strPrd = Add(strPrd, strVar)
        Next lngVar1
 
        Return strPrd
    End Function
 
    Public Function Subtract(ByVal strNo1 As String, ByVal strNo2 As String) As _
      String
        Dim bytDif As Byte
        Dim bytCarry As Byte
        Dim lngVar As Long
        Dim strDif As String = ""
        Dim strVar As String = ""
 
        strNo1 = LTrim0(strNo1)
        strNo2 = LTrim0(strNo2)
        If Len(strNo1) < Len(strNo2) Or (Len(strNo1) = Len(strNo2) And strNo1 < _
          strNo2) Then
            strVar = strNo1
            strNo1 = strNo2
            strNo2 = strVar
        End If
        strNo2 = Right$(New String("0", Len(strNo1)) & strNo2, Len(strNo1))
        For lngVar = Len(strNo1) To 1 Step -1
            bytDif = Val(Mid$(strNo1, lngVar, 1)) - Val(Mid$(strNo2, lngVar, _
              1)) - bytCarry + 10
            strDif = bytDif Mod 10 & strDif
            bytCarry = 1 - bytDif \ 10
        Next lngVar
        strDif = LTrim0(strDif)
        If strVar > "" Then strDif = "-" & strDif
        Return strDif
    End Function
End Module
Kann mir bitte jemand helfen?
Ich versteh das nämlich nicht so ganz.

Gruß Aicher
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Rechnen mit sehr großen Zahlen 
Autor: ModeratorDaveS (Moderator)
Datum: 29.05.14 11:38

Bitte solche Fragen ins richtige Forum posten, dann wissen wir immerhin welche Sprache, VB6 oder Vb.Net du verwendest. Ich vermute VB6. Die Sache ist allemal schwierig und sehr kniffelig, und alles als String zu halten wird extrem ineffizient sein. Und was deine genaue Frage ist ist nicht so ganz klar.

Besser Vb.Net und die BigInteger Klasse verwenden. (Damit kann man übrigens einigermaßen Nachkommastellen mit Multiplikation emulieren).

________
Alle Angaben ohne Gewähr. Keine Haftung für Vorschläge, Tipps oder sonstige Hilfe, falls es schiefgeht, nur Zeit verschwendet oder man sonst nicht zufrieden ist

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Rechnen mit sehr großen Zahlen 
Autor: ModeratorDaveS (Moderator)
Datum: 29.05.14 14:43

Naja, ich schätze kaum. Die Zahlen können aber sonst "unbegrenzt groß" sein. Meinst du etwa 4 Milliarde Dezimalstellen (was 8 GB verschlingen würde)? Dann brauchst du ca 4 mal so viel Speicher um 2 solche Zahlen zu multiplizieren. Es sei denn eine binäre Umwandlung in Bits zuerst stattfindet. Eine solche Nummer wäre ewig weit außerhalb jeder praktischen Zahl. 10^100 hat ja nur 101 Stellen. Und das ist schon weitaus mehr als alle Atome im (sichtbaren) Universum. Auch in der Kryptographie sind selten mehr als ca 500 Stellen notwendig. Wozu soll das gut sein (ich bin halt neugierig)? Mit Auslagerung würde jede Berechnung ohnehin unpraktisch viel Zeit brauchen (wenn nicht schon im Speicher).

________
Alle Angaben ohne Gewähr. Keine Haftung für Vorschläge, Tipps oder sonstige Hilfe, falls es schiefgeht, nur Zeit verschwendet oder man sonst nicht zufrieden ist

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Sie sind nicht angemeldet!
Um auf diesen Beitrag zu antworten oder neue Beiträge schreiben zu können, müssen Sie sich zunächst anmelden.

Einloggen  |  Neu registrieren

Funktionen:  Zum Thema  |  GesamtübersichtSuchen 

nach obenzurück
 
   

Copyright ©2000-2024 vb@rchiv Dieter Otter
Alle Rechte vorbehalten.
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.

Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel