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


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Sitro92 (Gast)


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


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


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


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


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


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


Bewertung
0 lesenswert
nicht lesenswert
> kleiner Schönheitsfehler in der Bezeichnung:

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

von Peter M. (r2d3)


Bewertung
0 lesenswert
nicht 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ürgen S. (engineer) Benutzerseite


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

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]
  • [vhdl]VHDL-Code[/vhdl]
  • [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.