Eigene Klasse für grosse Zahlen (war: probleme mit template)
-
ja ... habe ich ausversehen in den bigint ordner gepostet
der quelltext von dem oben die rede ist ist hier zu finden ...
-
Auch hier wird kein Bitfeld verwendet, sondern ein Array auf unsigned short (defaultmäßig).
Diese Klasse besitzt Konstruktoren für die meisten int-Typen sowie für const char*. In diesem wird wiederum der Zuweisungsoperator (einfaches memcpy) operator* und operator+ verwendet.
Das ist ein völlig anderes Design als deine Klasse.
-
Weißd du oder jemand anderes wie die datentype int oder long oder double intern aussehen ... das müssten doch auch strucs oder klassen sein oder?
so ähnlich müsste das doch dann gehen oda???
-
http://de.wikipedia.org/wiki/Integer_(Datentyp)
http://de.wikipedia.org/wiki/Gleitkommazahlbevor du anfängst, solltest du dich gründlich mit der problematik beschäftigen und genau wissen was du willst. nimm dir ein blatt papier und mal dir auf, was wie funktionieren soll. überleg dir, wie und welche daten du übergeben willst. beschäftige dich zuerst mit den grundlagen.
was für datentypen gibt es? wie sind diese aufgebaut? welchen wertebereich haben sie? wie kann ich beliebig große zahlen verwalten, die über die standardtypen hinausgehen? wie rechne ich mit ihnen? wie gebe ich sie im notfall aus?
dir sollte klar sein das man kein 1212497135891358971359137589 einfach so eingeben kann, sondern das das nur über einen string funktionieren kann.
wenn du keine templates verstehst, machs erstmal ohne!
bitfelder können auch nie grösser als ihr zugrundeliegende datentyp sein!
-
Danke für die infos ...
aber warum ist den sowas möglich, wenn du sagst: "bitfelder können auch nie grösser als ihr zugrundeliegende datentyp sein"?
signed mytype : 2048;
es wird eine variable mit 2048 bits erstellt???
und weiß jemand, wie man die einzelnen bits einlesen oder ausgeben kann ... von mir aus auch erstmal von int oder short??
-
hm... vlei gehts ja doch. bin noch nie auf die idee gekommen, sowas über ein bitfeld zu lösen, da es nicht sehr sinnvoll ist.
-
Dieser Thread wurde von Moderator/in Jansen aus dem Forum VCL/CLX (Borland C++ Builder) in das Forum Rund um die Programmierung verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
Frage an alle:
weiß wer, wie ich bei solch einen datentyp
signed mytype : 2048;
auf die einzelnen bits zugreifen kann, oder sie ändern kann???
bitte um hilfe!
Danke
-
so schonmal nicht.
wird die bitanzahl des zieltyps ueberschritten so wird auf die maximale bitanzahl des verwendeten typs zurueckgesetzt. (koennte bei signed 32 bit sein muss aber nicht).
ps. einzelne bits lassen sich ohnehin nicht adressieren.
-
sizeof(mytype);
wird linear größer ... somit wird früher oder später sicherlich auch früher oder später signed 32 überschritten
oder nicht???
-
Eine rein in C++ geschiebene Großzahlklasse kann hier gefunden werden: http://www.dhost.info/voodoocpp/index.php?page=progs/libs
Vor allem Num::Natural dürfte interessant sein.
Auf die einzeln Bits kannst du nicht direct zugreifen. Dies muss über die bitwise Operatoren gemacht werden.
-
Hi!
1000 dank an Ben04
die klasse schaut vielversprechend ausleider stelle ich mich ein wenig dumm an ... wie kann ich denn eine Zahl von der klasse natural vereinbaren?
-
Tommi schrieb:
wie kann ich denn eine Zahl von der klasse natural vereinbaren?
Was meinst mit vereinbaren? Num::Natural speichert eine Ganzzahl zwischen 0 und dem was dein Speicher hergibt.
Eine Num::Natural kann folgendermaßen angelegt werden:
Natural a = 56; // nur für kleinere als long gültige Werte Natural b = Natural::dec("15513154583215445121322"); // für größere Zahlen zur Basis 10 Natural c = Natural::hex("AF34FB4674CDE"); // für größere Zahlen zur Basis 16 cout<<a;
Am schnellsten dieser 3 Varianten ist die erste dann kommt die dritte und am langsamsten ist die decimal Version.
Die Ausgabe erfolgt ganz einfach über cout.
-
herzlichen dank ... aber dann sethe ich ja wieder vor dem alten problem ... ich wollte ohne char's arbeiten ... so langsam glaube ich aber, dass das garnicht möglich ist?? ... trotzdem frage ich mich wie z.b. int programmiert ist? oder werden die typen von anderen programmiersprachen einfach übernommen ... z.b. aus assembler??
aber wenn die irgendwo herkommen, so sollte es doch irgendwie möglich sein einen datentyp der größer als int und long... etc. ... zu erschaffen ... oder ist das garnicht möglich???
-
Und was ist daran so schlimm das man die mit nem String initialisieren muss? Das ist doch völlig unwichtig.
-
Tommi schrieb:
herzlichen dank ... aber dann sethe ich ja wieder vor dem alten problem ... ich wollte ohne char's arbeiten ... so langsam glaube ich aber, dass das garnicht möglich ist?? ... trotzdem frage ich mich wie z.b. int programmiert ist? oder werden die typen von anderen programmiersprachen einfach übernommen ... z.b. aus assembler??
aber wenn die irgendwo herkommen, so sollte es doch irgendwie möglich sein einen datentyp der größer als int und long... etc. ... zu erschaffen ... oder ist das garnicht möglich???
Hi,
du wirst den umweg über chars wohl gehen müssen, da etwas anderes nicht vom standard vorgesehen ist
Das ganze ist eher ein problem der sprache: Konstanten, die im code stehen, dürfen nun mal nur die länge eines longs haben... (alles andere: undefiniert) (*)
Allzu langsam sollte die variante mit den chars aber nicht sein, da der char nur bei der konstruktion, bzw. bei der neuzuweisung einer bestimmten zahl gebraucht wird... Wenn du dann operationen (plus, minus, etc.) auf den typ ausführst, wird dann wieder eine interne bit-repräsentation gebraucht.(*) http://www.kuzbass.ru:8086/docs/isocpp/lex.html, 2.13.1 - Integer literals [lex.icon]:
-2- [...] if the value cannot be represented as a long int, the behavior is undefined. [...]
-
sicher das das nicht geht??(ohne char's)
mal ne andere frage:
wie kann ich eigendlich zwei zahlen subtraieren, ohne zu wissen, welche größer ist und ohne das zu prüfen???
-
Es geht nur über Strings! Es gibt keine größeren Literale.
-
Tommi schrieb:
... trotzdem frage ich mich wie z.b. int programmiert ist?
int ist ein buildin-Type und wie der Name bereits vermute lässt, sind diese Type fest im Compiler eingebaut und folgen ihren eigenen Regeln. Ein int ist keine Klasse.
Tommi schrieb:
sicher das das nicht geht??(ohne char's)
Sicher, du kannst keine Literale definiren. Du kannst nur die fest in den Compiler eingebauten Literale zweckentfremden. Dies sind die Zahlen und- Stringliterale. Da die Zahlenliterale zu klein sind bleiben nur die Stringliterale. Nicht schön allerdings kommen riese Literale sowieso sehr selten im Code vor. Meistens wenn man mit großen Zahlen zu tun hat dann ist es eine Benutzereingabe oder ein Zwischenresultat.
mal ne andere frage:
wie kann ich eigendlich zwei zahlen subtraieren, ohne zu wissen, welche größer ist und ohne das zu prüfen???
Gar nicht.
-
Tommi schrieb:
wie kann ich eigendlich zwei zahlen subtraieren, ohne zu wissen, welche größer ist und ohne das zu prüfen???
Hi,
du könntest, um die Differenz zu ermitteln, die beiden zahlen voneinander subtrahieren, und dann std::abs auf das ergebnis anwenden, um den betrag zu erhalten (falls zu das willst).