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!
> 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.
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?
> 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.
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!
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.
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.
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.