Eigene Klasse für grosse Zahlen (war: probleme mit template)



  • thx Braunstein!

    aber das funktioniert nur mit int richtig?

    ich wollte ja auch solche zugriffe möglich machen:
    a = 12345678901234567890123456789;



  • Genau das geht nur für int und mach somit den Sinn einer bigint-Klass zunichte.
    Du müsstest auch einen Konstruktor für char* schreiben. Wie du allerdings deinen char* in deine Klasse bekommst weiß ich auch nicht.
    Hast du einen Algorithmus zum Übertragen der Zahlen in ein Bitfeld?
    Was ich bisher so gesehen habe arbeitet eigentlich intern mit arrays.
    Schau auch mal in diesen Thread
    http://www.c-plusplus.net/forum/viewtopic-var-t-is-110330.html



  • wenn ich ein konstruktor für char* schreiben würde, könnte ich denn die variabeln mit a =

    12345678901234567890123456789;
    

    füllen?

    leider kenne ich keinen algorithmus zum übertragen von zahlen in bitfelder 😞

    ich muss dazuschreiben, ich habe jetzt zum 4. mal angefangen so einen type zu proggen ...

    1. ich habe komplet mit einem ansistring als zahl gearbeitet ... hat auch alles wunderbar funktioniert ... aber sau, sau langsam

    2. ich habe ein array mit ints gemacht und, da der int type 10 stellen hat, aber davon nur 9 nutzbar sind, da die vorderste ziffer maximal 2 sein kann, den type in 9-ner blöcke zerhackt ... hat auch wunderprächtig funktioniert ... aber gefiehl mir immer noch nicht so recht und war bestimmt auch nicht effizent ... aber egal

    3. ich habe versucht binär zu denken und erstmal nur mit bool gearbeitet ... der type war leider nicht schneller als einer der beiden ersten, da es mir nicht möglich war einen 1 bit type u erstellen (oder geht das??)

    4. tja daran arbeite ich ja gerade 😃

    ich muss auch dazu sagen, ich habe wohl schon nahezu das ganze internet durchforstet ... auch viel gefunden und viel neues gelernt! und nicht gerade zeit und mühe gescheut ... aber meine 4. variante geht von der überlegung aus keine liste und kein array zu machen ... leider weiß ich nicht recht ob das möglich ist ... aber ich habe was interessantes dazu gefunden ... darum glaube ich auch das das ganze klappen muss ... ich verstehe den quelltext nur nicht recht ... kann sich das mal - jemand kleveres als mir - anschauen und mir so evtl. weiterhelfen?

    den thread habe ich mir übrigend angesehen aber reichlich wenig verstanden ... vor allem nicht die schlussendliche lösung 😞



  • Was hast dun denn zu bigint mit Bitfeldern gefunden? Kannst du da mal einen Link angeben?



  • ja ... habe ich ausversehen in den bigint ordner gepostet

    der quelltext von dem oben die rede ist ist hier zu finden ...

    escsender.es.funpic.de/LongInt.h



  • 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/Gleitkommazahl

    bevor 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 aus 😃

    leider 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. [...]


Anmelden zum Antworten