mehr als eine 64bit int
-
CStoll schrieb:
So, und jetzt versuch' mal, das selbe für die Multiplikation zweier Zahlenwerte zu realisieren

Natürlich geht das da nicht aber das liegt nicht daran, dass es schwer ist herauszufinden, dass eine Multiplikation überläuft (was es wahrscheinlich nicht einmal ist) sonder, dass diese Information wertlos ist.
Nehmen wir das Zehnersystem mal Beispiel. Egal welche 2 Zifferen du zusammen ziehst, der Zehner ist entweder 1 oder 0. Dies gilt auch wenn man den Overflow der verherigen Zahlen betrachtest. Bei der Multiplikation bringt dir die Information ob es überläuft gar nichts, da der Zehner mehr als 2 Werte annehmen kann. Desweiteren kann man anders als bei der Addition die Zifferen auch nicht positionsunabhängig behandeln.
xGost schrieb:
Also wenn ich das richig verstanden habe,
werden die zahlen in ein vector<char> abgelegt,Aus Performangründen ist vector<unsigned long long> oder vector<unsigned long> wahrscheinlicher.
-
BigNeal schrieb:
xGhost schrieb:
2^8 = 255
falsch

0xFF = 2x 2^4 = 2^8 = zahlenstrahl 0 - 255
0x00 = 0000.0000 = 0
0x01 = 0000.0001 = 1
0x02 = 0000.0010 = 2
0x03 = 0000.0011 = 3
0x04 = 0000.0100 = 4
0x05 = 0000.0101 = 5
0x06 = 0000.0110 = 6
0x07 = 0000.0111 = 7
0x08 = 0000.1000 = 8
0x09 = 0000.1001 = 9
0x0A = 0000.1010 = 10
0x0B = 0000.1011 = 11
0x0C = 0000.1100 = 12
0x0D = 0000.1101 = 13
0x0E = 0000.1110 = 14
0x0F = 0000.1111 = 15
....
0xFF = 1111.1111 = 255So jetzt sollte es stimmen ^^
-
Ben04 schrieb:
CStoll schrieb:
So, und jetzt versuch' mal, das selbe für die Multiplikation zweier Zahlenwerte zu realisieren

Natürlich geht das da nicht aber das liegt nicht daran, dass es schwer ist herauszufinden, dass eine Multiplikation überläuft (was es wahrscheinlich nicht einmal ist) sonder, dass diese Information wertlos ist.
Nehmen wir das Zehnersystem mal Beispiel. Egal welche 2 Zifferen du zusammen ziehst, der Zehner ist entweder 1 oder 0. Dies gilt auch wenn man den Overflow der verherigen Zahlen betrachtest. Bei der Multiplikation bringt dir die Information ob es überläuft gar nichts, da der Zehner mehr als 2 Werte annehmen kann. Desweiteren kann man anders als bei der Addition die Zifferen auch nicht positionsunabhängig behandeln.
Klar, die Multiplikation ist etwas schwieriger, aber lässt sich recht analog zu meiner obigen Addition auch umsetzen.
xGost schrieb:
Also wenn ich das richig verstanden habe,
werden die zahlen in ein vector<char> abgelegt,Aus Performangründen ist vector<unsigned long long> oder vector<unsigned long> wahrscheinlicher.
Und für die Übertrag-Behandlung bei der Multiplikation ist ein vector<char> oder vector<short> günstiger - ein short hat definitiv genug Platz, um das Produkt zweier char-Werte aufzunehmen, für das Produkt zweier long long Werte kenne ich keinen ausreichend großen Zahlentyp.
xGhost schrieb:
0xFF = 2x 2^4 = 2^8 = zahlenstrahl 0 - 255
Egal wie du es drehst - diese Aussage ist *sorry* Schwachsinn. 0xFF=255. Punkt.
(OK, die darunterstehende Aufzählung stimmt dann)
-
wie wärs wenn du dir net klasse für nen komplexen datentyp schreisbt???
alsotemplate <class T> class complex { ... ... complex(T, T); ... ... ... T real, im; ... };
-
shade37337 schrieb:
wie wärs wenn du dir net klasse für nen komplexen datentyp schreisbt???
Erstens: Was hat diese Klasse mit "große Integer-Werte" zu tun?
Zweitens: Wieso schreiben? Die Klasse gibt es schon (heißt std::complex und lebt im Header <complex>).
-
CStoll schrieb:
Klar, die Multiplikation ist etwas schwieriger, aber lässt sich recht analog zu meiner obigen Addition auch umsetzen.
Da bin ich zwar gespant wie du für die Multiplikation die Information ob es eine Überlauf gibt verwerten kannst.
Meine Klasse macht das folgendermaßen:
Natural mul(const Natural&a, const Natural&b){ Natural prod(0); unsigned ms_bit = b.get_most_significant_bit_set(); for(unsigned bit = 0; bit < ms_bit; ++bit) if(b.is_bit_set(bit)) prod += (a<<bit) return prod; }Was der Tafelrechung wie ich sie in der Schule gelernt hab angewant auf binär Zahlen entspricht.
-
Ben04 schrieb:
CStoll schrieb:
Klar, die Multiplikation ist etwas schwieriger, aber lässt sich recht analog zu meiner obigen Addition auch umsetzen.
Da bin ich zwar gespant wie du für die Multiplikation die Information ob es eine Überlauf gibt verwerten kannst.
pair<char,char> mul_pos(char r,char l) { short res=r*l; return make_pair(res&0xFF,res>>8); }Damit muß ich nur noch in einer doppelten Schleife über alle Zahlenstellen gehen und die Werte mittels add_pos() (von oben) zusammenaddieren.
-
CStoll schrieb:
Und für die Übertrag-Behandlung bei der Multiplikation ist ein vector<char> oder vector<short> günstiger - ein short hat definitiv genug Platz, um das Produkt zweier char-Werte aufzunehmen, für das Produkt zweier long long Werte kenne ich keinen ausreichend großen Zahlentyp.
stimmt, short wuerde ich auch vorziehen.
Short sollte reichen um eine ziffer (0 ... 9) zu speichern.Sicherleich interessant dazu:
http://de.wikipedia.org/wiki/Dualsystem#Grundrechenarten_im_DualsystemGg
-
Für eine einzelne Ziffer (0 bis 9) ist selbst ein char schon zu groß
(um das voll auszunutzen, solltest du intern im 256er System rechnen)
-
xGhost schrieb:
BigNeal schrieb:
xGhost schrieb:
2^8 = 255
falsch

0xFF = 2x 2^4 = 2^8 = zahlenstrahl 0 - 255
Vl. hab ich es ned sauber aufgeschrieben.
Ich meinte:eine 8bit integer kann eine zahl von 0 bis und mit 255 darstellen.
Somit kann er 256 verschiedene zahlen darstellen.