Rechnen mit sehr großen Zahlen (über 100.000 Stellen) mit Komma
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:
Kann mir bitte jemand helfen?
Ich versteh das nämlich nicht so ganz.
Gruß Aicher
Gelöst: ICH DRAF NICHT MIT GLEITKOMMAZAHLEN RECHNEN; SONDERN MIT BYTES
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
Gelöst: ICH DRAF NICHT MIT GLEITKOMMAZAHLEN RECHNEN; SONDERN MIT BYTES
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 239548
Url: https://administrator.de/forum/rechnen-mit-sehr-grossen-zahlen-ueber-100-000-stellen-mit-komma-239548.html
Ausgedruckt am: 02.04.2025 um 19:04 Uhr
12 Kommentare
Neuester Kommentar
Moin,
und was genau verstehst du nicht? Warum er keine Kommazahlen berechnet?
Schau dir dann das mal an:
http://de.wikibooks.org/wiki/Visual_Basic_.NET:_Variablen
Vielleicht kommst du selbst drauf...
Gruß
und was genau verstehst du nicht? Warum er keine Kommazahlen berechnet?
Schau dir dann das mal an:
http://de.wikibooks.org/wiki/Visual_Basic_.NET:_Variablen
Vielleicht kommst du selbst drauf...
Gruß
Du verstehst es ja offenbar nicht warum er keine Kommazahlen anzeigt/berechnet, denn sonst wüsstest du ja wo der Fehler liegt?
Ich muss zugeben, ganz durchgestiegen bin ich nicht bei dem "Code", aber wenn ich mir so die Variablentypen ansehe stelle ich fest:
Byte
Long
String
Mit Byte und Long wirst du dann sicher rechnen...doch weder das eine noch das andere haben Kommastellen, denn es sind Ganzzahlvariablen. Steht ja auch auf der Seite die du schon lange kennst.
Dabei geht es auch nicht um MinValue und MaxValue sondern um Ganzzahlen und Gleitkommazahlen.
Gruß
Ich muss zugeben, ganz durchgestiegen bin ich nicht bei dem "Code", aber wenn ich mir so die Variablentypen ansehe stelle ich fest:
Byte
Long
String
Mit Byte und Long wirst du dann sicher rechnen...doch weder das eine noch das andere haben Kommastellen, denn es sind Ganzzahlvariablen. Steht ja auch auf der Seite die du schon lange kennst.
Dabei geht es auch nicht um MinValue und MaxValue sondern um Ganzzahlen und Gleitkommazahlen.
Gruß
was willst du bitte berechnen, das so viele Stellen hat ?
. Eventuell hilft dir das etwas weiter:
Grüße Uwe
Also nehm ich String
Wie mach ich das dann?
String wirst du aber trotzdem immer zu einem Format konvertieren müssen mit dem sich rechnen lässt, und da gibt es Grenzen in .NET. Und das mit Nachkomma, da ist dein Rechner sicherlich mehrere Monate beschäftigt Wie mach ich das dann?
- http://visualstudiomagazine.com/articles/2011/01/25/biginteger.aspx
- http://bytes.com/topic/algorithms/insights/886822-calculating-large-exp ...
Grüße Uwe
dann sollte das für dich ja kein Problem sein, das rauszufinden