Rechnen mit großen Zahlen!
-
Hallo.
Ich hoffe ich bin hier richtig.
Mal angenommen ich habe folgenden Code:int a = 0x4EC4EC4F; int b = 0x1FF; a*= b;Das ergebnis in a ist eigentlich 9D3B13B1B1
Ich bekomme in a ja nur 3B13B1B1 raus
Woher bekomme ich den Überlauf der Multiplikation ? Also die 9DMFG Matten
-
Wenn du die irgendwoher kriegen könntest, dann wäre ein Überlauf eine ziemlich unkritische Angelegenheit und das Leben eines Programmierers wär ein bißchen einfacher....
Ich fürchte du wirst dir etwas anderes überlegen müssen um so große Zahlen zu verarbeiten.
-
Na schreibs nich in einen int rein
double is größer, musste aber natürlich casten dann
-
Das Problem ist aber das ich den Überlauf benötige. Mit nem Double bin ich da dann auch noch nicht richtig weiter.
Ich versuche was aus asm umzusetzen.
MOV EAX,4EC4EC4F MOV ECX,1FF IMUL ECXDas Ergebnis steht dann in EAX, der Überlauf halt in EDX.
Und den brauch ich halt zum weiterrechnen.
-
Igitigat direktes Umwandeln von Assembler-Code in C/C++. Das gibt bestimmt richtig guter Code...
Nehme einen größeren Wertebereich, errechne dir die Anzahl der Stellen um die das Ergebnis verschoben werden soll und verschieb das Ergebnis um die errechnete Anzahl von Stellen.
-
zur Not mach doch einfach embedded Assembler, solange man das nicht übertreibt is das durchaus legal^^
-
Naja... zur Berechnung von einem Zahlenwert Assembler-Code in C++ einbetten?

-
er braucht ja den Überlauf zum Zahlenwert ...
-
Er baucht die Stellen x-y einer binären Zahl. Es mag in Assembler elegant sein diese mit Hilfe eines Overflows zu ermitteln, in C/C++ sollte man dies tunlichst lassen weil es schlicht und ergreifend von der Größe des Registers abhängig ist wann der Overflow auftritt.
-
Mathias schrieb:
Er baucht die Stellen x-y einer binären Zahl. Es mag in Assembler elegant sein diese mit Hilfe eines Overflows zu ermitteln, in C/C++ sollte man dies tunlichst lassen weil es schlicht und ergreifend von der Größe des Registers abhängig ist wann der Overflow auftritt.
nö.
mach ein template und spezialisiere das, was du mit assembler kannst.
dann haste einen compilerfehler, wenn es nicht klappt und wenn es klappt, haste feine performache. nichts anders suchten wir, oder?
-
@volkard
Mach mir keine Angst.(Man nehme sich einen ausreichend großen Datentyp multipliziere die beiden Zahlen, teile das ganze mit der Zahl ab der der Überlauf in Assembler auftritt und gut is.
Wenns noch mit einem ganzzahligen Datentyp geht kann man sich das Teilen sogar sparen und die Zahl einfach nach rechts verschieben.)