Hallo liebe C#-Gemeinde,
Als Ingenieur-Student bin ich etwas mit C# vertraut, jedoch kein Programmier-Experte.
Für ein Projekt an der Uni benötige ich ein Taschenrechner, der mit Zahlen unbegrenzter Größe rechnen kann (Arithmetik, Potenzieren), zum Beispiel Zahlen mit mehreren Millionen Stellen. Nach meiner Kenntnis ist die Darstellung großer Zahlen mit gängigen Computern bei 2^64 begrenzt (?). Mit größeren Zahlen lässt sich mit den üblichen Rechenbefehlen nicht rechnen. Und hier liegt mein Problem.
Im Netz habe ich hierzu zum Beispiel diesen Rechner für große (und kleine) Zahlen mit hoher Genauigkeit von Arndt Brünner entdeckt.
Der gefällt mir sehr gut.
Jedoch brauche ich einen eigenständigen Quellcode.
Nun meine Fragen an die Informatiker:
Ich bedanke mich schon im Voraus für eure Antworten!
Gruß Thomas
Hallo Thomas A,
herzlich Willkommen auf myCSharp!
Beschäftige dich mal mit der BigInteger-Struktur, die dem .NET-Framework in der Version 4.0 hinzugefügt wurde. Die Größe der Ganzzahlen, mit denen du damit rechnen kannst, ist dabei nur durch den vorhandenen Arbeitsspeicher begrenzt.
m0rius
Mein Blog: blog.mariusschulz.com
Hochwertige Malerarbeiten in Magdeburg und Umgebung: M'Decor, Ihr Maler für Magdeburg
Schau Dir das mal C#: How Should I Handle Arithmetic with Huge Numbers? an...
Dort findest Du auch Verweise auf Source-Code.
Hallo,
das ist hier ebenfalls mein erster Beitrag. Ich verfolge bereits seit mehreren Monaten die Beiträge in diesem Forum und bin von der Qualität sehr beeindruckt.
Zum Thema. Es gibt eine sehr gute Bibliothek (Multiple Precision Arithmetic Library) zu großen Zahlen mit folgenden Typen*Integer *Rational *Fließkommazahl
Es handelt sich hierbei um eine C Bibliohtek, die sehr einfach eingebundet werden kann. Die Bibliothek bietet alles, was man zur Umsetzung eines Taschenrechners mit "unendl." großen Zahlen benötigt.
Gruß Thomas
Sehr interesant,
Danke für eure Antworten!
Nun kommt mir die Frage auf:
Wenn die Größe der Zahl allein durch den Arbeitsspeicher des verwendeten Rechners abhängt, wie groß könnte dann eine Zahl bei herkömmlichen 4GB / 8GB Arbeitsspeicher dargestellt werden (wie viele Stellen)?
Lässt sich dazu eine Aussage treffen oder eine Berechnung durchführen?
Mit freundlichen Grüßen
Wenn ich das Ausrechne komme ich auf eine zahl mit 13743895347 Stellen bei einem Verbrauch von 4 GB. Die größte Darstellbare Zahl ist dabei (wenn man vom Speicherplatz für Verwaltung absieht:
Bytes pro GB = 230 = 1073741824
Bytes für 4GB = 4 * 230 = 232 = 4294967296
In Bits = 8 * 232 = 2^35 = 34359738368
Also ist die Größte darstellbare Zahl = 2^34359738368 - 1
Ich hoffe ich habe mich nirgendwo verrechnet. Was noch sein kann ist, dass die Ansteuerung der Bytes durch einen integer passiert, dass würde die Größe des Speichers auf 4GB begrenzen.
Hallo Thomas_A,
zusätzlich musst du natürlich bedenken, dass für die Berechnung nicht 100% des Arbeitsspeichers zur Verfügung stehen wird, denn zumindest das Betriebssystem sowie deine Software belegen ja ebenfalls Teile des Arbeitsspeichers.
m0rius
Mein Blog: blog.mariusschulz.com
Hochwertige Malerarbeiten in Magdeburg und Umgebung: M'Decor, Ihr Maler für Magdeburg
Hallo pdelvo,
die maximale/minimale Zahl hängt davon ab ob das Programm in einem x86 oder x64 Prozess läuft.
Bei x86 kann ein Programm generell nur 2GB an Speicher anfragen, von denen ca 1.5 GB frei ansprechbar sind.
Bei x64 ist es etwas anders, dort können theoretisch 8TB angefragt werden. Jedoch ist dabei zu beachten dass jedem .NET Object "nur" 2 GB an Speicher zugewiesen werden kann.
Zusätzlich ist maximal darstellbare Zahl nicht 2n-1 sondern 2n-1-1, da das erste Bit das Vorzeichen angibt.
Gruß
Michael
Hallo,
also, die max. positive Zahl erhälst du
2^(n-1)-1
n := Anzahl der Bits
Die Anzahl der darstelllbaren Stellen im 10er System
log (2^(n-1)-1)
log := 10er Logarithmus
Bei 4 GB Arbeitsspeicher = 2^32 Bits ergibt das
log (2^(2^32-1)-1)
Wolframalpha: [URL=http://www.wolframalpha.com/input/?i=log[10%2C+%282^%282^32-1%29-1%29]]Berechnung[/url], Ergebnis
Bei 4GB Speicher kann eine Zahl mit 109 Zehnerpotenzen abgespeichert werden.
z.B. 10(10^9)
Gruß, Thomas
Hallo xxMUROxx,
die maximale/minimale Zahl hängt davon ab ob das Programm in einem x86 oder x64 Prozess läuft.
wegen der genannten Einschränkungen für .NET-Objekte sind die tatsächlichen Unterschiede für die Maximalgröße für ein einzelnes Objekt (1,5GB vs 2GB) nicht besonders drastisch. Anders wird das erst, wenn wir über mehrere große Objekte reden. Dann kann unter x64 - genügend großer Arbeitsspeicher vorausgesetzt - jedes Objekt zwei GB groß werden, unter x86 alle zusammen nur 1,5GB.
Hallo m0rius,
zusätzlich musst du natürlich bedenken, dass für die Berechnung nicht 100% des Arbeitsspeichers zur Verfügung stehen wird, denn zumindest das Betriebssystem sowie deine Software belegen ja ebenfalls Teile des Arbeitsspeichers.
nicht nur dass, sondern vor allem wie er belegt ist (Fragmentierung), denn .NET-Objekte brauchen den Arbeitsspeicher zusammenhängend. Für eine 2GB großes Objekt kommt also nicht nur drauf an, dass die 2GB frei sind, sondern dass die zusammenhängend frei sind. Das bedeutet in der Praxis, dass die Maximalgröße oft deutlich unter den theoretisch möglichen 2GB liegt.
Hallo Thomas_A,
das wurde allerdings alles schon früher besprochen, sowohl im Forum als auch in Netz. Bitte immer erst die Suche benutzten.
herbivore