Multiplizieren von Mantissen?
Hallo liebe Community,
ich sitze gerade an einer Aufgabe in der ich zwei 32-Bit Gleitkommazahlen nach IEEE 754 Standard multiplizieren soll.
Ich habe folgende zwei Gleitkommazahlen:
1 1000 0001 1001 0110 0000 0000 0000 000
*
0 1000 0100 0101 0101 0000 0000 0000 000
Da gehe ich ja wie folgt vor:
- Berechnung des Vorzeichens: s = s1 xor s2 = 1 xor 0 = 1
- Multiplikation der Mantissen
- Addition der beiden Charakterisitken und Subtraktion mit dem Bias Wert
- Rundung (falls notwendig)
Ich komme leider nicht weiter bei der Multiplikation der Mantissen. Ich habe echt lange recherchiert und habe gelesen, dass man irgendwas nach rechts shiften muss, aber ich verstehe es einfach nicht wie ich die multiplizieren kann.
Würde es mir hier vielleicht einer erklären.
Multiplikation von
1.1001 0110 0000 0000 0000 000 * 1.0101 0101 0000 0000 0000 000
Ich komme echt nicht weiter...
2 Antworten
1.1001011 * 1.01010101
======================
11001011
11 001011
1100 1011
110010 11
1 1001011
======================
10.0001110 01100111
Die Faktoren haben 7 und 8 Nachkommastellen
also hat das Ergebnis 15 Nachkommastellen
==> 10.000111001100111
Und dann noch die Exponenten richten ...
-6,34375 * 42,625 = -270,40234375
1 1000 0111 0000 1110 0110 0111 0000 000
Deine Mantissenmultiplikation stimmt.
Dann musst du noch den Exponenten bestimmen. Dazu von den Exponenten jeweils den Exzess abziehen und die Ergebnisse addieren (der Exzess ist glaube ich 127, aber bin nicht sicher).
Dann muss man den Punkt im Mantissenprodukt so verschieben, dass man wieder 1 vor dem Punkt hat, und die Verschiebung muss zur Exponentensumme addiert werden. Muss man z. B. den Punkt 1 nach links schieben, wird das Produkt dadurch um den Faktor 2 kleiner, zum Ausgleich wird 1 zum Exponenten addiert.
Dann wieder zum Exponenten den Exzess addieren und vom Mantissenprodukt die 23 Bits nach dem Punkt speichern.
Was soll ich +127 rechnen? Ich habe viele verschiedene Kombinationen ausprobiert und komme bei keiner auf 1000 0111.
Einmal habe ich mein Endergebnis +127 gerechnet:
0000 0111 + 0111 1111 = 1000 0110
Dann habe ich die einzelnen Charakteristiken +127 gerechnet:
1000 0001 + 0111 1111 = 1| 0000 0000
1000 0100 + 0111 1111 = 1| 0000 0011
Ich komme bei beiden nicht auf 1000 0111.
Also nochmal von vorne:
1 1000 0001 1001 0110 0000 0000 0000 000
steht für (-1)^1 * 2^(129-127) * 1.1001 011
= -1,5859375 * 4 = -6,34375
0 1000 0100 0101 0101 0000 0000 0000 000
steht für (-1)^0 * 2^(132-127) * 1.0101 0101
= +1,33203125 * 32 = 42,625
Das Produkt der Mantissen ergibt
2,112518310546875
* 2^2^(2+5) = 270,40234375
Dadurch, dass das Produkt größer als 1 ist, ist der Exponent entsprechend kleiner. Normierung auf 1 vor dem Komma macht ihn wieder 1 größer.
(129-127) + (132-127)+127 = 2+5+127 =134 = 1000 0110
--> 1000 0111 Passt
Bei meiner schriftlichen Multiplikation habe ich die Nachkommastellen nicht richtig berücksichtigt, ich korrigiere das mal ...
Du vergisst, dass durch das Normalisieren der Mantisse (Punkt um 1 nach links schieben) noch 1 zum Exponenten zu addieren ist.
Oh man irgendwie ist das mega verwirrend. Wenn ich halt beide Zahlen nehme und in Dezimal umrechne dann habe ich einmal -6,34375 und einmal 42,625.
So wenn ich jetzt einfach, diese Zahlen im Taschenrechner multipliziere komme ich auf -270,402 und wenn ich das wieder in IEEE 754 Standard umrechne komme ich auf folgendes:
1 1000 0111 0000 1110 0110 0110 1110 101
Aber ich komme einfach nicht auf dieses Ergebnis.
Zuerst habe ich das Vorzeichen ausgerechnet, das geht ja ganz einfach mit xor:
1 xor 0 = 1
Also habe ich schonmal das Vorzeichen, welches auch richtig ist.
Ich habe probiert mit deiner Methode den Exponenten auszurechnen, also die Charakterisitk.
Dazu habe ich von der ersten Charakteristik 127 subtrahiert:
1000 0001 - 0111 1111 = 0000 0010
Von der zweiten Charakteristik habe ich auch 127 subtrahiert:
1000 0100 - 0111 1111 = 1000 0101
Dann habe ich die beiden Ergebnisse addiert:
0000 0010 + 1000 0101 = 1000 0111
Okay damit habe ich die Charakteristik, welche auch korrekt ist.
Nun hänge ich aber immer noch bei der Mantisse:
Ich habe mir erstmal die Antwort eines weiteren Nutzers angeschaut, welcher als Mantisse folgende angegeben hatte:
1.0000 1110 0110 0111 0000 000
Aber diese Mantisse stimmt nicht mit der überein, die die richtige Gleitkommazahl eigentlich hat.
Da diese Mantisse aber in drei Bytes mit der richtigen Mantisse übereinstimmt, muss ja ein richtiger Ansatz dahinter stecken und man muss wahrscheinlich noch irgendwas mit der Mantisse machen, damit ich auf die richtige Mantisse komme. Du hast ja geschrieben, dass man den Punkt im Mantissenprodukt so verschieben muss, dass wieder eine eins davor steht, das ist ja aber bei der angegebenen Mantisse schon der Fall, also muss ich da ja nichts mehr verschieben. Aber wie komme ich jetzt auf die richtige Mantisse?
Das liegt an dem Rundungsfehler, wenn man nur auf 6 Stellen rechnet; genauer ist das Ergebnis -270.40234375
Oh man es hätte alles so einfach sein können, hätte ich daran gedacht. Stundenlanges Kopfzerbrechen nur, weil mir mein Tascherechner nur drei Nachkommastellen anzeigt. Aber vielen, vielen Dank für deine Hilfe!
Der Windows-Rechner rechnet m.W. intern mit 64bit Gleitkommazahlen. Das sollte reichen. Der kann auch binäre Integer.
Welcher Taschenrechner rechnet diese Multiplikation denn auf nur 3 Nachkommastellen?
Ich habe meinen Taschenrechner aus der Schule genutzt. Ein TI-nspire CX CAS.
Der rechnet eigentlich auch auf 8 Nachkommastellen, aber dafür muss man sozusagen erst auf das Ergebnis klicken.
Und das habe ich halt nicht gemacht.
Hinterher ist man immer schlauer. 3 und 5 Nachkommastellen ergeben im Produkt 8 Nachkommastellen und die müssen in diesem Fall mit 5 enden.
Ich habe noch eine weitere Frage dazu.
Die Charakteristik ist ja eigentlich folgende:
Aber wie genau komme ich da auf die linke 1?
Ich habe deine Methode angewandt, also von der ersten Charakteristik habe ich 127 abgezogen:
Dann subtrahierte ich 127 von der zweiten Charakteristik:
Eigentlich kommt da ja 0000 0101 raus und nicht wie ich vorher geschrieben habe 1000 0101.
So wenn ich jetzt die beiden Ergebnisse addiere komme ich auf folgendes:
Und diese Charakteristik ist ja nicht die richtige, eigentlich müsste ganz links anstatt einer 0 eine 1 stehen, aber wie rechne ich, dass dort ganz links eine 1 steht?