Ich habe versucht, die Gleitkommadarstellung in C mit diesem Code zu verstehen (sowohl float
als auch int
sind 4 Bytes auf meinem Rechner):
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.
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
-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:
Das bedeutet also, die Berechnung ist stattdessen:
%Vor% Das obige ist python, wobei **
dasselbe bedeutet wie ^
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
Tags und Links c floating-point