Eigene Klasse für grosse Zahlen (war: probleme mit template)
-
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).
-
sicher, dass die subtraktion nicht unabhängig von der größeren zahl funzt???
ich habe hier ne schaltung gefunden, die für subt. und addition funzt und wohl auch unabhängig davon, welche zahl größer ist ... oder seht ihr das anders??
die pdf ist hier: escsender.es.funpic.de/da03_facharbeit.pdf
(recht weit unten...)
-
kann mir wirklich keiner helfen
-
trotzdem frage ich mich wie z.b. int programmiert ist?
oder werden die typen von anderen programmiersprachen einfach übernommen ... z.b. aus assembler??
wie kann ich eigendlich zwei zahlen subtraieren, ohne zu wissen, welche größer ist und ohne das zu prüfen???also du willst grundrechenoperationen fuer beliebig grosse zahlen?
die standard-datentypen ruehren nunmal daher, dass die prozessor-register eben 32bit breit sind und dementsprechend nur zahlen begrenzter groesse bearbeitet werden koennen.
aber du kannst dir natuerlich leicht beliebig grosse datentypen erzeugen in dem du einfach entsprechend viele integers zb als array hintereinandersetzt.
bei einer addition muesstest du dann lediglich pruefen ob beim addieren zweier (einzelner) integers ein ueberlauf stattgefunden hat und dementsprechend diesen ueberlauf auf die addition des hoeherwertigen integer-paares uebertragen.
subtraktion liesse sich genauso als a+-b realisieren, wobei die negation ein einfaches zweierkomplement ist.
-
Tommi schrieb:
kann mir wirklich keiner helfen
Nun ja die Frage:
wie kann ich eigendlich zwei zahlen subtraieren, ohne zu wissen, welche größer ist und ohne das zu prüfen???
wurde ja schon beantwortet mit
Gar nicht.
Und eine weitere wurde nicht gestellt.
Ohne jetzt den von dir geposteten Link im Detail zu lesen gehe ich mal davon aus, dass es sich um eine ganz gewöhnlich Schaltung handelt wie man sie oder ähnlich in den meisten Processoren findet. Auch diese weiß welche Zahl grösser ist. Wenn man nur mit gleich großen Zahlen arbeitet braucht man dies nicht zu testen da die Antwort offensichtlich ist.
Bedenke : int hat immer eine fest Anzahl von Ziffern (Bits) wogegen man bei Zahlen auf dem Papier bei Bedarf eine weitere hinzunimmt oder fallen lässt
-
@ Ben04: meine erneute frage bezog sich tatsächlich auf die pdf...
@ hellihjb: vielen dank ... das probiere ich aus ... wenn das funzt wäre ja super
vielen dank