Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Rechnen mit unbegrenzt großen Zahlen (Taschenrechner)
Thomas_A
myCSharp.de - Member



Dabei seit:
Beiträge: 2

Themenstarter:

Rechnen mit unbegrenzt großen Zahlen (Taschenrechner)

beantworten | zitieren | melden

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:
1. Ist ein solcher Taschenrechner für große Zahlen schwierig umzusetzen?
2. Gibt es vielleicht bereits solch ein Programm oder Quellcode zum Nachsehen oder Herunterladen?
3. Eigent sich C# gut für dieses Problem?

Ich bedanke mich schon im Voraus für eure Antworten!
Gruß Thomas
private Nachricht | Beiträge des Benutzers
m0rius
myCSharp.de - Member

Avatar #avatar-3125.png


Dabei seit:
Beiträge: 1043

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
weismat
myCSharp.de - Member



Dabei seit:
Beiträge: 878
Herkunft: Frankfurt am Main

beantworten | zitieren | melden

Schau Dir das mal C#: How Should I Handle Arithmetic with Huge Numbers? an...
Dort findest Du auch Verweise auf Source-Code.
private Nachricht | Beiträge des Benutzers
Thomas_1
myCSharp.de - Member



Dabei seit:
Beiträge: 26
Herkunft: Bayern

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
Thomas_A
myCSharp.de - Member



Dabei seit:
Beiträge: 2

Themenstarter:

Grenze durch Arbeitspeicher

beantworten | zitieren | melden

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
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Thomas_A am .
private Nachricht | Beiträge des Benutzers
pdelvo
myCSharp.de - Member

Avatar #avatar-3354.png


Dabei seit:
Beiträge: 1407

beantworten | zitieren | melden

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 = 2^30 = 1073741824
Bytes für 4GB = 4 * 2^30 = 2^32 = 4294967296
In Bits = 8 * 2^32 = 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.
private Nachricht | Beiträge des Benutzers
m0rius
myCSharp.de - Member

Avatar #avatar-3125.png


Dabei seit:
Beiträge: 1043

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
xxMUROxx
myCSharp.de - Member

Avatar #avatar-3236.jpg


Dabei seit:
Beiträge: 1626
Herkunft: Südtirol/Italien

beantworten | zitieren | melden

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
Mein Blog
Meine WPF-Druckbibliothek: auf Wordpress, myCSharp
private Nachricht | Beiträge des Benutzers
Thomas_1
myCSharp.de - Member



Dabei seit:
Beiträge: 26
Herkunft: Bayern

beantworten | zitieren | melden

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 10^9 Zehnerpotenzen abgespeichert werden.
z.B. 10^(10^9)

Gruß, Thomas
private Nachricht | Beiträge des Benutzers
herbivore
myCSharp.de - Experte

Avatar #avatar-2627.gif


Dabei seit:
Beiträge: 52329
Herkunft: Berlin

beantworten | zitieren | melden

Hallo xxMUROxx,
Zitat
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,
Zitat
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
private Nachricht | Beiträge des Benutzers