Forum: Mikrocontroller und Digitale Elektronik Multiplikation von 2er Komplement Darstellung


von Stefan (Gast)


Lesenswert?

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

von A.K. (Gast)


Lesenswert?

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.

von Stefan (Gast)


Lesenswert?

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

von Falk (Gast)


Lesenswert?

@Stefan

>Kann der MUL oder FMUL-Befehl mit 2er Komplementen umgehen ?

Heute schon RTFMt?

MFG
Falk

von A.K. (Gast)


Lesenswert?

> das Problem ist nur das die nicht auf 2er Komplemente angewendet
> werden können, oder ?

Warum nicht?

von Stefan (Gast)


Lesenswert?

@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

von A.K. (Gast)


Lesenswert?

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

von A.K. (Gast)


Lesenswert?

Tippfehler. -5 >> 1 = -3 (Rundung => -infinity)

von Stefan (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.