mikrocontroller.net

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


Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: A.K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Falk (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Stefan

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

Heute schon RTFMt?

MFG
Falk

Autor: A.K. (Gast)
Datum:

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

Warum nicht?

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: A.K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: A.K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Tippfehler. -5 >> 1 = -3 (Rundung => -infinity)

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.