Laden...

Suche Datentyp für Zahlen mit beliebig vielen (Vor- und Nachkomma-)Stellen

Erstellt von Palladin007 vor 10 Jahren Letzter Beitrag vor 10 Jahren 3.155 Views
Hinweis von herbivore vor 10 Jahren

Der Originaltitel war: "Einzelne Bits referenzieren".

Palladin007 Themenstarter:in
2.078 Beiträge seit 2012
vor 10 Jahren
Suche Datentyp für Zahlen mit beliebig vielen (Vor- und Nachkomma-)Stellen

Moin,

ich brauche eine sehr große Anzahl von Ziffern.

Meine erste Idee war, Byte zu verwenden, allerdings kann das eine Zahl bis maximal 255 darstellen und hat eine Größe von 8 Bits - 4 Bit zu viel.

Da ich an sich nur eine Ziffer benötige, nichts was mehrere Stellen enthält, habe ich mir überlegt, ich schreibe mir einen neuen Zahlen-Typ, der nur eine Ziffer darstellen kann, allerdings dann mit möglichst geringer Speicher-Nutzung.

Gibt es eine Möglichkeit, wie ich nicht mit Bytes arbeite, sondern die einzelnen Bits verwende?

C
258 Beiträge seit 2011
vor 10 Jahren

vielleicht kannst du uns etwas mehr zu deinem vorhaben sagen, was ist für dich sehr groß?

5.657 Beiträge seit 2006
vor 10 Jahren

Weeks of programming can save you hours of planning

Palladin007 Themenstarter:in
2.078 Beiträge seit 2012
vor 10 Jahren

Die Idee war, einen Datentyp zu schreiben, der so groß werden kann, wie die Speicher-Auslastung zulässt.

Da dieser Typ logischerweise aber extrem große Zahlen und damit extrem viele Ziffern darstellen kann, möchte ich für für jede Ziffer einen möglichst geringen Speicher-Aufwand verlangen.

Mein erster Gedanke war, String zu verwenden, aber das ist noch größer, als wenn ich einfach bytes in ein Array lege.

Meine zweite Idee war, eine Klasse zu schreiben, die intern die Anzahl bereits erstellter Zahlen zählt (was leider 8 byte für double kostet und gleichzeitig die Anzahl Ziffern auf double.MaxValue beschränkt) und dann bytes in ein Array legt, aber direkt die einzelnen Ziffern abfragt.
Also, wenn ich die erste Ziffer anlege, wird ein byte in das Array gelegt und der Zähler um eins hoch gesetzt. Wird eine zweite Angelegt, so multipliziere ich das byte mit 10 und habe dann eine zweite Stelle zur verfügung, bleibe aber bei einem byte Speicher-Auslastung.
Das ganze mache ich dann aber vermutlich nicht mit herkömmlichen Rechen-Operationen, sondern mit eben diesen Bitoperatoren, die MrSparkle verlinkt hat.

(Wobei mir da gerade einfällt, dass die letzte Ziffer von Byte nur bis 5 geht, ich müsste also irgendeinen anderen Typ nehmen und zerlegen)

Das alles ist aber doch ein recht großer Aufwand und wenn dann eine Zahl benötigt wird, die theoretisch 1MiB belegt, dann wären das 1.048.576 * 2 Ziffern. Dafür dann aber noch jede zusätzliche Operatin ablaufen zu lassen, die dafür sorgt, dass die Speicher-Auslastung verringert wird, das würde dann schon sehr ins Gewicht fallen.
Daher die Idee, einzelne Bits nehmen und so vier Bits direkt ansprechen. Pro bit ein Zustand, 16 mögliche Zustände für den Typ, die kleinst mögliche Größe um alle 10 Ziffern darstellen zu können.
Das hätte auch keine Begrenzung, da es dem Typ egal ist, wie viele Ziffern existieren.

Mit der Idee, die einzelnen Stellen eines bereits vorhandenen Zahlen-Typs zu nutzen, teilt die genutzte Speicher-Menge des Typs durch die Anzahl der Stellen, die möglich sind, bedeutet aber für jede Erstellung einer Ziffer, jeden Abruf und jede Änderung der Ziffer zufätzlichen Rechenaufwand.

Ich hoffe, ihr konnten meine Gedankengänge soweit nachvollziehen. ^^

16.807 Beiträge seit 2008
vor 10 Jahren

Ich bin mir nicht sicher, ob Du mit BigInteger nicht besser fährst. Jede Instanz hat ja seinen gewissen Overhead. Prozentual wirst Du mit vielen kleinen Typen dann viel viel mehr Overhead haben, als mit einem größeren.

C
258 Beiträge seit 2011
vor 10 Jahren

Dein ansatz mit Ziffern ist falsch damit kann man nie das maximum erreichen da du mit 2* 4 bit nu 0-99 darstellen kannst während ein byte 0-255 darstellen kann.

des weiteren ist eine floating point number wie double nicht präzise und verliert information.

Ich würde eher den ansatz gehen mit long oder int zu arbeiten anstelle von char/bit oder byte/

sieh dir mal die implementierung von BigInteger an vielleicht ist das etwas in deine richtung.

EDIT: Ich wusste garnicht das es eine Framework klasse auch gibt ^^

Palladin007 Themenstarter:in
2.078 Beiträge seit 2012
vor 10 Jahren

Ach das gibts schon, sogar im .NET-Framework und ich dachte, ich hätte mal was Neues. -.-
Na dann hats keinen Sinn mehr, das zu schreiben, aber trotzdem Danke, jetzt kenne ich eine neue Klasse 😄

Gibts das auch schon für Komma-Stellen?

49.485 Beiträge seit 2005
vor 10 Jahren

Hallo Palladin007,

schau dir mal Decimal.GetBits an. Decimal hat zwar nicht beliebig viele Stellen, aber ich will auch nur auf die Repräsentation bzw. das Prinzip heraus, wie man aus aus einem Integer-Wert und einem Exponenten auch eine Zahl mit Nachkommastellen realisieren kann. Im Netz finden sich sicher weitere Details zu dieser Art der Repräsentation von Kommazahlen.

herbivore

Palladin007 Themenstarter:in
2.078 Beiträge seit 2012
vor 10 Jahren

Decimal.GetBits kann ich mir mal anschauen, danke.