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

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

Moderationshinweis von herbivore (31.10.2013 - 08:11)

Der Originaltitel war: "Einzelne Bits referenzieren".

Palladin007
myCSharp.de - Member

Avatar #avatar-4140.png


Dabei seit:
Beiträge: 1.567
Herkunft: Düsseldorf

Themenstarter:

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

beantworten | zitieren | melden

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



Dabei seit:
Beiträge: 258

beantworten | zitieren | melden

vielleicht kannst du uns etwas mehr zu deinem vorhaben sagen, was ist für dich sehr groß?
private Nachricht | Beiträge des Benutzers
MrSparkle
myCSharp.de - Team

Avatar #avatar-2159.gif


Dabei seit:
Beiträge: 5.649
Herkunft: Leipzig

beantworten | zitieren | melden

[Artikel] Bitoperationen in C#
Weeks of programming can save you hours of planning
private Nachricht | Beiträge des Benutzers
Palladin007
myCSharp.de - Member

Avatar #avatar-4140.png


Dabei seit:
Beiträge: 1.567
Herkunft: Düsseldorf

Themenstarter:

beantworten | zitieren | melden

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. ^^
private Nachricht | Beiträge des Benutzers
Abt
myCSharp.de - Team

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 15.490

beantworten | zitieren | melden

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



Dabei seit:
Beiträge: 258

beantworten | zitieren | melden

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

Avatar #avatar-4140.png


Dabei seit:
Beiträge: 1.567
Herkunft: Düsseldorf

Themenstarter:

beantworten | zitieren | melden

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 :D

Gibts das auch schon für Komma-Stellen?
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Palladin007 am .
private Nachricht | Beiträge des Benutzers
herbivore
myCSharp.de - Experte

Avatar #avatar-2627.gif


Dabei seit:
Beiträge: 49.486
Herkunft: Berlin

beantworten | zitieren | melden

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

Avatar #avatar-4140.png


Dabei seit:
Beiträge: 1.567
Herkunft: Düsseldorf

Themenstarter:

beantworten | zitieren | melden

Decimal.GetBits kann ich mir mal anschauen, danke.
private Nachricht | Beiträge des Benutzers