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.
:
Bearbeitet durch User
> kleiner Schönheitsfehler in der Bezeichnung:
Wirklich? -x ist negieren, ~x ist invertieren, oder?
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.