Mantisse von float falsch?



  • Hallo,

    ich habe als Übung die Berechnung der Bits eine Gleitkommazahl des Typs float per Fuß erledigt und habe anscheinend einen Fehler gemacht. Ich weiß leider nicht, wo ich den Fehler genau gemacht habe, könnte sich jemand dies bitte mal anschauen?

    Es geht um die Zahl 6.4 hier habe ich folgende Bits ausgerechnet(Vorzeichen, Exponent, Mantisse):
    0 00000010 10011001100110011001100

    In der Musterlösung der Übung ist am Ende eine 1, wie kommen die darauf?
    0 00000010 10011001100110011001101

    Meine Zwischenergebnisse für die normalisierte und reduzierte Mantisse sieht so aus:
    1 1,2
    0 0,4
    0 0,8
    1 1,6
    1 1,2
    0 0,4
    0 0,8
    1 1,6
    1 1,2
    0 0,4
    0 0,8
    1 1,6
    1 1,2
    0 0,4
    0 0,8
    1 1,6
    1 1,2
    0 0,4
    0 0,8
    1 1,6
    1 1,2
    0 0,4
    0 0,8

    Das Muster 1100 wiederholt sich immer, woher soll da die 1 kommen?



  • Ich würde vermuten, dass einfach kaufmännisch gerundet wird.



  • Es wird immer zu der Zahl gerundet die am nächsten dran ist, wenn beide gleich nah sind wird abgerundet.
    Ich hab mal meinen Computer gefragt (Programm unten) er kommt auch auf 01000000110011001100110011001101.
    Ich hab mal nachgerechnet ist näher dran
    Differenz zu 0,4: ca. 6,1*10^-6 vs ca. 1,5*10^-6

    #include <stdlib.h>
    #include <stdio.h>
    #include <stdint.h>
    union fi {
    	float Float;
    	uint32_t Int;
    };
    void print_bin32(uint32_t this)
    {
    	char str[33];
    	for(int i=31; i >= 0; i--) {
    		str[i] = (this % 2) ? '1' : '0';
    		this /= 2;
    	}
    	str[32] = '\0';
    	fputs(str, stdout);
    }
    int main(void)
    {
    	union fi fi = {.Float = 6.4};
    	printf("%f\n", fi.Float);
    	print_bin32(fi.Int);
    	putchar('\n');
    }
    




  • Ok, aber wie muss ich dann meinen Algorithmus, für die Mantissen-Berechnung, anpassen?

    Ich multipliziere die normalisierte Mantisse mit 2 und teste dann auf 1.0. Ist dem so kommt eine 1 sonst 0. Bei einer 1 wird wieder 1.0 abgezogen und das Spiel geht von vorne los. Dies mache ich solange, bis mir die Bits für die Mantisse ausgehen, im Falle vom float ist bei 23 Bit Schluss.


Anmelden zum Antworten