• Apfeltalk ändert einen Teil seiner Allgemeinen Geschäftsbedingungen (AGB), das Löschen von Useraccounts betreffend.
    Näheres könnt Ihr hier nachlesen: AGB-Änderung
  • Was gibt es Schöneres als den Mai draußen in der Natur mit allen Sinnen zu genießen? Lasst uns teilhaben an Euren Erlebnissen und macht mit beim Thema des Monats Da blüht uns was! ---> Klick

Mit Hexadezimalen Gleitkommazahlen rechnen

Msc

Braeburn
Registriert
21.01.09
Beiträge
43
Hallo zusammen!
Hier erstmal meine Aufgabe:


Gegeben sind die zwei Zahlen 41AF8000 und 414E0000 als Hexadezimaldarstellung einer Fließkommazahl nach IEEE 754.


Berechnen Sie die Dezimaldarstellung, dann multiplizieren Sie die Zahlen. Codieren Sie das Ergebnis neu als Fließkommazahl. Falls die Umrechnung zurück einen Rundungsfehler beinhaltet, muss der auch angegeben werden.


Wie sieht die Fließkommazahl als Binärfolge aus? Wie ist die Hexadezimaldarstellung dieser Binärfolge?


Nun mein Rechenweg:


Die Zahl 41AF8000 entspricht der Zahl 0100 0001 1010 1111 1000 0000 0000 0000.
Ich trenne die erste Ziffer ab, sie gibt mir an, dass es sich um eine positive Zahl handelt. Die darauf folgenden 8 Ziffern stellen die Zahl 131 dar. Nun ziehe ich die Zahl 127 ab und komme auf 4.
Diese 4 gibt an, dass ich das Komma bei den restlichen 23 Ziffern um 4 nach rechts verschieben muss. Zusätzlich kommt die Zahl 1 vorne dran, es ergibt sich:


1010 1.111 1000 0000 0000 0000


Die zahl vor dem Komma entspricht der Zahl 21 (16+4+1), der Wert der Zahl 41AF8000 ist also 21,....


Nun berechne ich aus den Zahlen nach dem Komma die nachkomma Stellen, allerdings diesmal mit 2^(-X), sprich: 2^(-1) + 2^(-2) + 2^(-3) + 2^(-4) = 0,9375


41AF8000 entspricht also 21,9375.


Mit der gleichen Rechnung für 414E0000 kommt raus, dass 414E0000 = 12,875.


Nun muss ich die zahlen multiplizieren, 21,9375*12,875= 282,4453125


Diese Zahl soll ich neu als Fließkommazahl codieren.


Dazu teile ich die Zahl durch 2^(X) um eine Zahl zwischen 1 und 2 rauszubekommen. Nach ausprobieren stelle ich fest, dass ich 2^8 nehmen muss.


282,4453125 / 2^8 = 1,103302002


Nun subtrahiere ich den Wert 1,103302002 um 1 da er größer gleich 1 ist.
Diesen nehme ich solange mal 2, bis der Wert größer 1 ist. Dann ziehe ich wieder 1 ab und multipliziere ihn wieder mit 2, und zwar genau 23mal. Jedes mal wenn der Wert größer 1 ist schreibe ich eine 1 auf.


Ich mache also folgendes:


0,103302002 * 2 = 0,206604004 {0}
0,206604004 * 2 = 0,412208008 {0}
0,412208008 * 2 = 0,824416016 {0}
0,824416016 * 2 = 1,648832032 {1} --> Die Zahl -1
0,648832032 * 2 = ....... (insgesamt 23 mal)




--> Das Ergebnis setzt sich nun aus dem Vorzeichen (da positiv der Wert 0), dem 8Bit Wert aus 127 + dem Exponenten von vorhin (8), also zusammen 135 = 10000111, und dem 23Bit Code den ich vorhin erreichnet habe.


Zusammen ergibt sich, dass 282,4453125 = 0100 0011 1000 1101 0011 1001 0000 0000


Als hex-schreibweise wäre das: 438D3900


Nun meine Frage: Wie errechne ich einen Rundungsfehler? Wo ist überhaupt eine Rundung?


Vielen Dank!


Msc