Hallo an alle, wie kann man elegant Vorzeichenbehaftete Integer Zahlen (Ergbnis von 2er Komplement Addition) multipliziern. a) allgemeine Methode ? b) spezialle (einfache) Multiplikation mit *2 *4 *8 etc.... Im Moment würde ich eine negative Zahl (2er Komp.) wieder zu einer positven Ganzahl umwandeln, dann Shift Operation oder mul Befehl anwenden und dann das Ergebnis wieder komplementieren. Ich bitte um Kommentare! Gruß Stefan
Das Ergebnis ist ja bis zu doppelt so gross wie die Operanden. Ein C-Compiler beispielsweise interessiert sich bei "*" aber nur für die untere Hälfte. Und die ist unabhängig davon, ob die Operanden mit oder ohne Vorzeichen sind, nur die obere Hälfte unterscheiden sich. Also kannst du ja nach Anforderung ggf. auf die Unterscheidung verzichten. Und was die Shift-Operationen bei Zweierpotenzen angeht, da empfehle ich ein paar Minuten Einsatz der eigenen grauen Zellen.
Hi A.K. das mit den Shift Operationen ist schon klar - das Problem ist nur das die nicht auf 2er Komplemente angewendet werden können, oder ? Das bei 8bit muls bis zu 16 bit rauskommen is auch klar! Ich verwende übrigens einen ATmega8 mit assembler. Kann der MUL oder FMUL-Befehl mit 2er Komplementen umgehen ? Danke Stefan
@Stefan
>Kann der MUL oder FMUL-Befehl mit 2er Komplementen umgehen ?
Heute schon RTFMt?
MFG
Falk
> das Problem ist nur das die nicht auf 2er Komplemente angewendet > werden können, oder ? Warum nicht?
@A.K. Ja-Warum eigentlich nicht !!!! Ich bin gerade aufgewacht - war ein blöder Denkfehler. Es geht: Multiplikation: Shift in Richtung höherwertiges bit und Auffüllen des LSB mit '0'. Division: Anderstherum und MSL auffüllen mit '1' bei negativen und '0' bei positiven Zahlen. Manchmal führt die richtige Frage - zur richtigen Lösung ! Danke
Bei Division funktioniert das so nicht so einfach. -5 / 2 = -2 (Rundung => 0) -4 >> 1 = -3 (Rundung => -infinity) Division bei negativem x: x / (2^n) = (x + (2^n-1)) >> n
Die Shifterei hat natürlich erhebliche Genauigkeitsprobleme --> dein Beispiel von oben: -5/2 ist gleich -3 -5 entspricht 0b1011 shift nach rechts und MSB mit 1 auffüllen liefert 0b1101 und das ist gleich -3 in der 2er-Komplement Norm. O.K. damit kann ich leben - will ja kein Taschenrechner bauen sondern einen PI oder PID Regler und die Regler Konstante entsprechend aufbereiten. Dies geschieht mit 16Bit Auflösung, da sollte der Rundungsfehler akzeptabel sein.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.