Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

Rechnen mit sehr großen Zahlen (über 100.000 Stellen) mit Komma

Frage Entwicklung Visual Studio

Mitglied: Aicher1998

Aicher1998 (Level 1) - Jetzt verbinden

29.05.2014, aktualisiert 12.08.2015, 1670 Aufrufe, 12 Kommentare

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:

01.
Module MATHs 
02.
    Public Function LTrim0(ByVal strVar As String) As String 
03.
        Do Until Len(strVar) = 1 Or Left$(strVar, 1) <> "0" 
04.
            strVar = Mid$(strVar, 2) 
05.
        Loop 
06.
        LTrim0 = strVar 
07.
    End Function 
08.
 
09.
    Public Function Add(ByVal strNo1 As String, ByVal strNo2 As String) As String 
10.
        Dim bytSum As Byte 
11.
        Dim bytCarry As Byte 
12.
        Dim lngMax As Long 
13.
        Dim lngVar As Long 
14.
        Dim strSum As String = "" 
15.
 
16.
        strNo1 = LTrim0(strNo1) 
17.
        strNo2 = LTrim0(strNo2) 
18.
        lngMax = IIf(Len(strNo1) > Len(strNo2), Len(strNo1), Len(strNo2)) 
19.
        strNo1 = Right$(New String("0", lngMax) & strNo1, lngMax) 
20.
        strNo2 = Right$(New String("0", lngMax) & strNo2, lngMax) 
21.
        For lngVar = Len(strNo1) To 1 Step -1 
22.
            bytSum = Val(Mid$(strNo1, lngVar, 1)) + Val(Mid$(strNo2, lngVar, 1)) + bytCarry 
23.
            strSum = bytSum Mod 10 & strSum 
24.
            bytCarry = bytSum \ 10 
25.
        Next lngVar 
26.
        If bytCarry Then strSum = bytCarry & strSum 
27.
 
28.
        Return strSum 
29.
    End Function 
30.
 
31.
    Public Function Divide(ByVal strNo1 As String, ByVal strNo2 As String) As String 
32.
        Dim bytQuo As Byte 
33.
        Dim lngVar As Long 
34.
        Dim strQuo As String = "" 
35.
        Dim strDiv As String = "" 
36.
        Dim strVar As String = "" 
37.
 
38.
        strNo1 = LTrim0(strNo1) 
39.
        strNo2 = LTrim0(strNo2) 
40.
        lngVar = Len(strNo2) 
41.
        strDiv = Left$(strNo1, lngVar) 
42.
        Do While lngVar <= Len(strNo1) 
43.
            strVar = Subtract(strDiv, strNo2) 
44.
            bytQuo = 0 
45.
            Do While Left$(strVar, 1) <> "-" 
46.
                bytQuo = bytQuo + 1 
47.
                strVar = Subtract(strVar, strNo2) 
48.
            Loop 
49.
            strQuo = strQuo & CStr(bytQuo) 
50.
            lngVar = lngVar + 1 
51.
            strDiv = Subtract(strNo2, Mid$(strVar, 2)) & Mid$(strNo1, lngVar, 1) 
52.
        Loop 
53.
 
54.
        Return LTrim0(strQuo) 
55.
    End Function 
56.
 
57.
    Public Function Modulo(ByVal strNo1 As String, ByVal strNo2 As String) As String 
58.
        Return Subtract(strNo1, Multiply(strNo2, Divide(strNo1, strNo2))) 
59.
    End Function 
60.
 
61.
    Public Function Multiply(ByVal strNo1 As String, ByVal strNo2 As String) As String 
62.
        Dim bytPrd As Byte, bytCarry As Byte 
63.
        Dim lngVar1 As Long, lngVar2 As Long 
64.
        Dim strPrd As String, strVar As String 
65.
 
66.
        strNo1 = LTrim0(strNo1) 
67.
        strNo2 = LTrim0(strNo2) 
68.
 
69.
        If Len(strNo1) > Len(strNo2) Then 
70.
            strVar = strNo1 
71.
            strNo1 = strNo2 
72.
            strNo2 = strVar 
73.
        End If 
74.
 
75.
        strPrd = "0" 
76.
 
77.
        For lngVar1 = Len(strNo1) To 1 Step -1 
78.
            strVar = New String("0", Len(strNo1) - lngVar1) 
79.
            bytCarry = 0 
80.
            For lngVar2 = Len(strNo2) To 1 Step -1 
81.
                bytPrd = Mid$(strNo1, lngVar1, 1) * Mid$(strNo2, lngVar2, 1) + bytCarry 
82.
                strVar = bytPrd Mod 10 & strVar 
83.
                bytCarry = bytPrd \ 10 
84.
            Next lngVar2 
85.
            If bytCarry Then strVar = bytCarry & strVar 
86.
            strPrd = Add(strPrd, strVar) 
87.
        Next lngVar1 
88.
 
89.
        Return strPrd 
90.
    End Function 
91.
 
92.
    Public Function Subtract(ByVal strNo1 As String, ByVal strNo2 As String) As String 
93.
        Dim bytDif As Byte 
94.
        Dim bytCarry As Byte 
95.
        Dim lngVar As Long 
96.
        Dim strDif As String = "" 
97.
        Dim strVar As String = "" 
98.
 
99.
        strNo1 = LTrim0(strNo1) 
100.
        strNo2 = LTrim0(strNo2) 
101.
        If Len(strNo1) < Len(strNo2) Or (Len(strNo1) = Len(strNo2) And strNo1 < strNo2) Then 
102.
            strVar = strNo1 
103.
            strNo1 = strNo2 
104.
            strNo2 = strVar 
105.
        End If 
106.
        strNo2 = Right$(New String("0", Len(strNo1)) & strNo2, Len(strNo1)) 
107.
        For lngVar = Len(strNo1) To 1 Step -1 
108.
            bytDif = Val(Mid$(strNo1, lngVar, 1)) - Val(Mid$(strNo2, lngVar, 1)) - bytCarry + 10 
109.
            strDif = bytDif Mod 10 & strDif 
110.
            bytCarry = 1 - bytDif \ 10 
111.
        Next lngVar 
112.
        strDif = LTrim0(strDif) 
113.
        If strVar > "" Then strDif = "-" & strDif 
114.
        Return strDif 
115.
    End Function 
116.
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
Mitglied: Xaero1982
29.05.2014 um 10:39 Uhr
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ß
Bitte warten ..
Mitglied: Aicher1998
29.05.2014 um 10:56 Uhr
Zitat von Xaero1982:
und was genau verstehst du nicht? Warum er keine Kommazahlen berechnet?
Klar versteh ich das. Bloß ich versteh nicht ganz, wie ich das machen muss.
Ich hab ja den ganzen Programmcode von einer älteren vb-Sprache auf Vb.net umwandeln müssen.

Danke, aber das kenn ich schon lang
Und sollte ich bei einem Datentype mal nicht wissen, was deren MinValue und MaxValue sind - ich hab mir da eine kleine Tabelle angefertigt und ausgedruckt.

Gruß Aicher
Bitte warten ..
Mitglied: Xaero1982
29.05.2014 um 11:03 Uhr
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ß
Bitte warten ..
Mitglied: colinardo
29.05.2014, aktualisiert um 11:32 Uhr
Moin Aicher,
wie Xaero schon sagt, solltest du mit Gleitkommazahlen wie z.B. Double rechnen:
01.
 Dim wert1 As Double = 1000006636636363666 
02.
 Dim wert2 As Double = 1000083838838999999 
03.
 Dim ergebnis As Double = wert1 * wert2 
04.
 MsgBox(ergebnis) 
05.
 
06.
' = 1,00009047603177E+36
Grüße Uwe
Bitte warten ..
Mitglied: Aicher1998
29.05.2014 um 11:36 Uhr
Zitat von colinardo:

Moin Aicher,
wie Xaero schon sagt, solltest du mit Gleitkommazahlen wie z.B. Double rechnen:
01.
>  Dim wert1 As Double = 1000006636636363666 
02.
>  Dim wert2 As Double = 1000083838838999999 
03.
>  Dim ergebnis As Double = wert1 * wert2 
04.
>  MsgBox(ergebnis) 
05.
>  
06.
> ' = 1,00009047603177E+36 
07.
> 
Blöd bloß, dass Doule kein datentyp ist der 100.000 stellen akzeptiert.
Also nehm ich String

Wie mach ich das dann?
Bitte warten ..
Mitglied: colinardo
29.05.2014, aktualisiert 21.09.2014
Zitat von Aicher1998:
Blöd bloß, dass Doule kein datentyp ist der 100.000 stellen akzeptiert.
was willst du bitte berechnen, das so viele Stellen hat ?
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 . Eventuell hilft dir das etwas weiter:
bin leider kein Mathematiker.

Grüße Uwe
Bitte warten ..
Mitglied: Aicher1998
29.05.2014 um 12:26 Uhr
Zitat von colinardo:

> Zitat von Aicher1998:
> Blöd bloß, dass Doule kein datentyp ist der 100.000 stellen akzeptiert.
was willst du bitte berechnen, das so viele Stellen hat ?
Die Antwort hat 2 Stellen: PI
> 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,
Ja, aber immer nur die einzelnen Stellen werden schrittweise zu einem Val-typ konvertiert.
Ich rechne ja nicht mit der ganzen Zahl sondern lass den Computer rechnen wie ich es rechnen würde (Schule).
Da gibt es doch die Methode der Schnellen Furor Transformation (kurz: FFT), hab aber noch nicht ganz kapiert, wie das funktioniert ...
und da gibt es
Grenzen in .NET. Und das mit Nachkomma, da ist dein Rechner sicherlich mehrere Monate beschäftigt .
Eher Stunden

Eventuell hilft dir
Werd ich schauen
bin leider kein Mathematiker.
Ich hab ne Eins in Mathe
Gruß Chris
Bitte warten ..
Mitglied: colinardo
29.05.2014, aktualisiert um 12:30 Uhr
Zitat von Aicher1998:
Ich hab ne Eins in Mathe
dann sollte das für dich ja kein Problem sein, das rauszufinden
Bitte warten ..
Mitglied: Aicher1998
29.05.2014 um 12:37 Uhr
Ja das bringt vielleicht was.
Auf diesen Datentype bin ich vor längerer Zeit schonmal gestoßen,
wusste aber nicht, wie ich hier die Zahl (bzw. den String) in die Byzrs umwandeln soll,
den mit dem System.Text.ASCIIEncoding.GetBytes oder so ähnlich hat es zwar erstmals funktioniert, aber bei längeren Zahlen wurde ein Problem daraus, da die Zhalen minimal mit dem zu erwartendem Ergebnis abwichen.
Da auf der Seite ja jetzt zu sehen ist, dass es evtl. mit Parse funktioniert, kann ich es ja nochmal probieren, sobald ich VB wieder offen hab. DANKE
Bitte warten ..
Mitglied: Aicher1998
29.05.2014 um 12:39 Uhr
Zitat von colinardo:

> Zitat von Aicher1998:
> Ich hab ne Eins in Mathe
dann sollte das für dich ja kein Problem sein, das rauszufinden
Ja aber keine Eins im Programmieren.
Ich kenne unzählige Mathematischen Tricks wie man beliebige Zahlen im Kopf zusammenrechnen oder wie man die Wurzel einer Zahl im Kopf ausrechnet (oder Annäherungsverfahren!)
Bitte warten ..
Mitglied: Aicher1998
29.05.2014 um 12:43 Uhr
Der unterstützt auch nur Ganzzahlen und ist somit - mal abgesehen davon dass dieser Type im Gegensatz zu meinem Code sogar Operatoren hat, die ich aber noch einbauen werd - auch nicht besser wie mein Code
aber trotzdem Danke
Bitte warten ..
Mitglied: bastla
29.05.2014 um 15:44 Uhr
Hallo Aicher1998!

Nun bin ich auch kein Mathematiker, aber ich könnte mir vorstellen, dass sich doch vorweg die Größenordnung (10er-Potenz) des Ergebnisses sollte bestimmen lassen - und dann würde ja das Komma während der Berechnung überhaupt nicht benötigt ...

Grüße
bastla
Bitte warten ..
Neuester Wissensbeitrag
CPU, RAM, Mainboards

Angetestet: PC Engines APU 3a2 im Rack-Gehäuse

(1)

Erfahrungsbericht von ashnod zum Thema CPU, RAM, Mainboards ...

Ähnliche Inhalte
Heiß diskutierte Inhalte
Switche und Hubs
Trunk für 2xCisco Switch. Wo liegt der Fehler? (14)

Frage von JayyyH zum Thema Switche und Hubs ...

DSL, VDSL
DSL-Signal bewerten (13)

Frage von SarekHL zum Thema DSL, VDSL ...

Windows Server
Mailserver auf Windows Server 2012 (9)

Frage von StefanT81 zum Thema Windows Server ...