Forum: FPGA, VHDL & Co. Multiplikation mit Zweierkomplement von Komma- und Integerzahlen


von Sitro92 (Gast)


Lesenswert?

Hallo,

während einer Projektarbeit bin ich auf folgendes Problem gestoßen: 
innerhalb der Beschreibung eines Algorithmus, der Grundlage für einen 
ASIC ist, wollte ich verschiedene Rechenvorgänge eines Multiplizierers 
auswerten. Dafür habe ich vorab die Ergebnisse per Hand berechnet.

Einfaches Beispiel: 2*(-0,5)=(-1) in binärer Schreibweise. Dafür habe 
ich die negative Zahl in das Zweierkomplement übersetzt und habe 
anschließend schriftlich multipliziert. Das grundsätzliche Zahlenformat 
sollte zunächst aus 5bit bestehen. Ein Vorzeichenbit sowie jeweils zwei 
Bit für Vor- und Nachkommastellen --> 2=01000 und -0,5=10010. Am Ende 
der Rechnung kam leider keine (-1) heraus und da stellte sich mir die 
Frage warum. Hat jemand eine Idee, warum ich Komma- und Integerzahlen 
unterschiedlichen Vorzeichens nicht einfach miteinander schriftlich 
multiplizieren kann? Mache ich hierbei etwas grundlegend falsch? Für 
Hinweise und Bemerkungen bin ich sehr dankbar!

von foobar (Gast)


Lesenswert?

> Ein Vorzeichenbit sowie jeweils zwei Bit für Vor- und
> Nachkommastellen --> 2=01000 und -0,5=10010. Am Ende
> der Rechnung kam leider keine (-1) heraus

Dann zeig doch mal deine Rechnung.

Btw, die Kodierung für -0.5 ist kein Zweierkomplement.

von Sitro92 (Gast)


Lesenswert?

Richtig, die (-0,5) ist noch nicht als Zweierkomplement dargestellt. 0,5 
wären nach dem zugrundeliegenden Schema 00010. Invertieren (11101) und 
eins addieren ergibt (1)1110. Mit der Vorzeichenerweiterung folgt:

  0000000010*1111111110
  _______________
         0000000000
         0000000100
         0000001000
         0000010000
         0000100000
         0001000000
         0010000000
  -----------------
         0011111100

Hierbei müssten nun die letzten vier Stellen für das Komma reserviert 
sein, sprich 1100, was anhand des Schemas eine 0,75 wäre. Das stimmt ja 
bekanntlich nicht. Wo ist der Denkfehler?

von foobar (Gast)


Lesenswert?

> Wo ist der Denkfehler?

Du hast 0.5 * -0.5 gerechnet. Das Ergebnis (1111111100) ist negativ, 
negieren ergibt 0000000100 = 0.25, also korrekte -0.25.

Falls der linke Multiplikant ganzzahlig sein sollte (also Wert 2), hat 
das Ergebnis nur zwei Nachkommastellen und damit ebenfalls korrekte -1.

von Sitro92 (Gast)


Lesenswert?

Da habe ich wohl nicht mehr ganz mitgedacht, danke für die Korrektur. 
Den Ausdruck 2*(-0,5) habe ich nochmal neu berechnet, jetzt stimmt 
alles. Mein Fehler lag darin, dass ich im Ergebnis nach dem Invertieren 
ein Vorzeichenbit erwartet habe. Aber da das Ergebnis ja im 
Zweierkomplement steht, kommt nach der Invertierung natürlich das 
positive Gegenstück bei heraus.

Nun ist alles klar, vielen Dank für die Hilfe!

von Peter M. (r2d3)


Lesenswert?

Hallo foobar,

foobar schrieb:
> Du hast 0.5 * -0.5 gerechnet. Das Ergebnis (1111111100) ist negativ,
> negieren ergibt 0000000100 = 0.25, also korrekte -0.25.

kleiner Schönheitsfehler in der Bezeichnung:

Negieren ergibt 0000000011, Bildung des Zweierkomplement (Negation und 
Addition von 1) ergibt 0000000100.

: Bearbeitet durch User
von foobar (Gast)


Lesenswert?

> kleiner Schönheitsfehler in der Bezeichnung:

Wirklich? -x ist negieren, ~x ist invertieren, oder?

von Peter M. (r2d3)


Lesenswert?

foobar schrieb:
> Wirklich? -x ist negieren, ~x ist invertieren, oder?

Nach meinem Verständnis ist negieren und invertieren dasselbe, bitweises 
Umkehren. Ich kenne die beiden obigen Operatorsymobole (-;~) leider 
nicht.

von J. S. (engineer) Benutzerseite


Lesenswert?

Negieren und Invertieren sind auf BItebene etwas anderes, als in 
Dezimalschreibweise. Das liegt eben an der Darstellung negierter Zahlen 
im Zweierkomplement. Bei diesem komplettiert der Gegenwert immer zu 
einer Binärzahl 2,4,8,16 ... und 256. Eine bitweise Invertierung liefert 
das Komplement zur jeweiligen Zahl-1, also führt 0 zu einer 255 bei 8 
bit.

Damit kann man auch rechnen, aber eben nicht im Zweierkomplement.

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.