PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Hex-Wert als Float interpretieren



Thomas Engelke
10-03-2004, 11:44
Hallo!

Dies hier hat nur bedingt mit C zu tun. Ich habe hier eine Uni-Übungsaufgabe, die wie folgt lautet:

Interpretieren Sie die folgenden hexadezimalen Werte als Fließkommazahl mit einfacher Genauigkeit.

Also schlage ich meinen Willms auf und schaue mir die strukturelle Hinterlegung einer float-Zahl im Speicher an:

1 Bit Vorzeichen
8 Bit Exponent
23 Bit Mantisse

Nun steht in der Aufgabe die Zahl "3cf0 0000". Die Lösung der Übungsaufgaben spricht von einer 1.5 als Ergebnis. Leider bekomme ich dies durch meine Überlegungen nicht hin.

3f=00111111
c0=11000000
Rest ist klar.

Also hat die Zahl

+ als Vorzeichen
01111111 (127) als Exponent
10000000000000000000000 (4194304) als Mantisse

Aber dieser Wert erscheint mir in Bezug auf die Musterlösung als deutlichst falsch. Kann jemand meinen Fehler korrigieren?

Danke,

AD!

wraith
10-03-2004, 12:33
Eine mögliche Lösung.


#include <stdio.h>

int main()
{
unsigned char f[] = {0x00,0x00,0xc0,0x3f};

float *ff = (float*)&f[0];

printf("%f",*ff);
}

Naja,aber die Aufgabenstellung ist so ungenau gestellt,mind. hätten sie das Format angeben müssen (1,8,23 ist auch nur eines von vielen).

Thomas Engelke
10-03-2004, 12:58
Hallo wraith!

Dies beweist mir zumindest, daß die Musterlösung richtig ist. Wie allerdings der Algo dahinter das rechnet, weiß ich dadurch leider noch nicht.

Komisch ist folgendes: Wir haben überlegt, daß die Darstellung einer 1,5 eigentlich 0,15*10^1 wäre. Dafür müßten wir im Bitmuster eine 15 (1111) sowie einmal den Exponenten 1 für die 10^1 finden. Aber das Bitmuster ist voll von Einsen. Irgendwie ergibt das für uns bisher keinen Sinn.

Wir knobeln weiter.

AD!

wraith
10-03-2004, 13:28
Hattet ihr keinen Algorithmus für die Umwandlung bekommen,und müßt jetzt selber raten?
Also für float -> hex.
1.5 float ist (1.1) in Basis 2,also Vorzeichen 0.
Ist schon normalisiert,also bekommt Exponent die Zahl 127 + 0,binär 1111111.
Und in die Mantisse die Nachkommastellen,hier 1,das macht
00111111110.....0 oder Hex 0x3f,0xC0,0x00,0x00.

Ja,an 1.5 ist wenig zu zeigen,also noch mal -10.25.
-(1010.01) binär,mit Vorzeichen 1.
Zur Normalisierung den Punkt um drei Stellen verschieben,nach links,also mal 2^3.
Damit ist Exponent 127 + 3 = 10000010.
Mantisse ist die Nachkommastelle,also 01001,das macht
11000001001001000....000

Jetzt mußt du nur noch rückwärts rechnen ;)

Thomas Engelke
10-03-2004, 14:03
Hey, danke! Jetzt sind wir fast schlau.

Eine Gegenfrage, sozusagen als letzte Chance: Warum ist der Exponent 127 zuzüglich der Verschiebunbg der Kommastelle?

AD!

wraith
10-03-2004, 14:13
Original geschrieben von Thomas Engelke

Eine Gegenfrage, sozusagen als letzte Chance: Warum ist der Exponent 127 zuzüglich der Verschiebunbg der Kommastelle?

Das ist ein Bias (Verschiebung) damit es auch möglich ist negative Werte vom Exponenten als positive Zahl in Dualdarstellung darstellen zu können.
Das der Bias hier 127 ist,liegt daran,daß der Exponent hier 8 Bit hat,und man etwa 50-50 positive und negative Werte haben will.
Bei double mit einem Exponenten von 11 Bit wäre der Bias 1023.

Thomas Engelke
10-03-2004, 14:25
Original geschrieben von wraith
Das ist ein Bias (Verschiebung) damit es auch möglich ist negative Werte vom Exponenten als positive Zahl in Dualdarstellung darstellen zu können.
Das der Bias hier 127 ist,liegt daran,daß der Exponent hier 8 Bit hat,und man etwa 50-50 positive und negative Werte haben will.
Bei double mit einem Exponenten von 11 Bit wäre der Bias 1023.

So halb lag diese Idee auch schon in meinem Kopf. Dann nehme ich diese Festlegung einfach so hin und denke mir als Grund: Keiner wollte im Exponenten mit dem 2er-Komplement agieren, also hat man sich für eine Offset-Speicherung entschieden.

Danke für die Hilfe.

AD!