Darstellung von float in C

8

Ich habe versucht, die Gleitkommadarstellung in C mit diesem Code zu verstehen (sowohl float als auch int sind 4 Bytes auf meinem Rechner):

%Vor%

Wir wissen, dass die binäre Darstellung von x die folgende ist

00000000000000000000000000000011

Daher hätte ich erwartet, dass y wie folgt repräsentiert wird:

  • Vorzeichenbit (erstes Bit von links) = 0

  • Exponent (Bits 2-9 von links) = 0

  • Mantisse (Bits 10-32): 1 + 2^(-22)+2^(-23)

Führt zu y = (-1)^0 * 2^(0-127) * (1+2^(-22) + 2^(-23)) = 5.87747E-39

Mein Programm druckt jedoch

aus

3 4.203895e-45

Das heißt, y hat den Wert 4.203895e-45 anstelle von 5.87747E-39 , wie ich es erwartet hatte. Warum passiert das. Was mache ich falsch?

P.S. Ich habe auch die Werte direkt von gdb gedruckt, so dass es kein Problem mit dem Befehl printf ist.

    
Siggi 17.07.2010, 13:10
quelle

3 Antworten

12

IEEE-Gleitkommazahlen mit Exponentenfeldern aller 0 sind "denormalisiert". Dies bedeutet, dass das implizite 1 vor der Mantisse nicht mehr aktiv ist. Dadurch können wirklich kleine Zahlen dargestellt werden. Siehe Dieser Wikipedia-Artikel für weitere Erklärungen . In Ihrem Beispiel wäre das Ergebnis 3 * 2 ^ -149

    
deinst 17.07.2010, 13:20
quelle
6

-127 im Exponenten ist reserviert für denormalisierte Zahlen. Ihre Berechnung ist für normalisierte Zahlen, während Ihr Float ein denormalisierter Float ist.

Denormalisierte Zahlen werden mit einer ähnlichen Methode berechnet, aber:

  1. Exponent ist -126
  2. implizites führendes Bit wird nicht mehr angenommen

Das bedeutet also, die Berechnung ist stattdessen:

%Vor%

Das obige ist python, wobei ** dasselbe bedeutet wie ^

    
freespace 17.07.2010 13:30
quelle
1

Im Detail wird Ссылка beschrieben Dieser Standard geht davon aus, dass Sie die linke Mantisse verschieben, bis Sie das erste Bedeutungsbit (steigender Exponent) ausblenden. In deinem Fall hast du den Ausdruck 1 + 2 ^ (- 23) - dann bekommst du die richtige Antwort 4.9..E-32

    
Dewfy 17.07.2010 13:23
quelle

Tags und Links