Fliesskommazahlenumrechnung

Benutzeravatar
davidvajda.de
Site Admin
Beiträge: 1424
Registriert: Di Jul 18, 2023 8:36 pm
Wohnort: D-72072, Tübingen
Kontaktdaten:

Fliesskommazahlenumrechnung

Beitrag von davidvajda.de »

Code: Alles auswählen

// Also, ich bin jetzt so weit gekommen. Da ist ein Fehler drin

#include <stdio.h>

int main (void) {
    float a;
    int i;

    printf ("%i\n", sizeof(a));
    a = 543.75;

    for (i = 0;  i < 32;  i++)
        printf ("%i", (((unsigned short int)*(&a)) >> (31-i)) & 0x01);

return 0;
}

/* f = (-1)^s * 1.m * 2^(e-b)
 * -543.75
 * 543 / 2 = 271        Rest 1
 * 271 / 2 = 135        Rest 1
 * 135 / 2 = 67         Rest 1
 * 67 / 2 = 33          Rest 1
 * 33 / 2 = 16          Rest 1
 * 16 / 2 = 8           Rest 0
 * 8 / 2 = 4            Rest 0
 * 4 / 2 = 2            Rest 0
 * 2 / 2 = 1            Rest 0
 * 1 / 2 = 0            Rest 1
 *
 * 10.0001.1111
 *
 * 0.75 * 2 = 1.5       1
 * 0.5 * 2 = 1          1
 *
 * 10.0001.1111.11
 * 1,000.0111.1111
 * Jetzt zunächst Ohne Vorzeichen. das Komma um 9 Stellen verschoben
 * 127 + 9 = 136
 *
 * 136 / 2 = 68         Rest 0
 * 68 / 2 = 34          Rest 0
 * 34 / 2 = 17          Rest 0
 * 17 / 2 = 8           Rest 1
 * 8 / 2 = 4            Rest 0
 * 4 / 2 = 2            Rest 0
 * 2 / 2 = 1            Rest 0
 * 1 / 2 = 0            Rest 1
 *
 * 1000.1000
 *
 * 0 | 1000.1000 | 10.0001.1111.11
*/
Doch an meiner Umrechnung scheint alles zu stimmen - nur das Float in C scheint an dieser Stelle bei mir nicht zu stimmen
Weil, nachdem ich den Wert vor dem Komma änderte, änderte sich die Darstellung, als ich danach etwas änderte nicht.

Code: Alles auswählen

// Ok, dieses Programm tut besser

#include <stdio.h>
#include <string.h>

int main (void) {
    float a;
    int i;
    char s[sizeof(float)];

    printf ("%i\n", sizeof(a));
    a = (float)543.75;

    memcpy(s, &a, sizeof(a));

    for (int i = 0; i < sizeof(float); ++i)
        printf("%x", s[i]);
return 0;
}

/* f = (-1)^s * 1.m * 2^(e-b)
 * -543.75
 * 543 / 2 = 271        Rest 1
 * 271 / 2 = 135        Rest 1
 * 135 / 2 = 67         Rest 1
 * 67 / 2 = 33          Rest 1
 * 33 / 2 = 16          Rest 1
 * 16 / 2 = 8           Rest 0
 * 8 / 2 = 4            Rest 0
 * 4 / 2 = 2            Rest 0
 * 2 / 2 = 1            Rest 0
 * 1 / 2 = 0            Rest 1
 *
 * 10.0001.1111
 *
 * 0.75 * 2 = 1.5       1
 * 0.5 * 2 = 1          1
 *
 * 10.0001.1111.11
 * 1,000.0111.1111
 * Jetzt zunächst Ohne Vorzeichen. das Komma um 9 Stellen verschoben
 * 127 + 9 = 136
 *
 * 136 / 2 = 68         Rest 0
 * 68 / 2 = 34          Rest 0
 * 34 / 2 = 17          Rest 0
 * 17 / 2 = 8           Rest 1
 * 8 / 2 = 4            Rest 0
 * 4 / 2 = 2            Rest 0
 * 2 / 2 = 1            Rest 0
 * 1 / 2 = 0            Rest 1
 *
 * 1000.1000
 *
 * 0 | 1000.1000 | 10.0001.1111.11
*/
Wobei wir aufpassen müssen, mein Computer speichert in little Endian

Nein, ich habe die Musterlösung

Es kommt einen deut was anderes raus, als mein C Programm sagt.

Ach, so jetzt weiss ich wo der Fehler ist, die führende 1 muss nicht dargestellt werden, das war der Fehler.

Code: Alles auswählen

/ * Das entspricht etwa, dem, was in der Lösung steht */

#include <stdio.h>
#include <string.h>

int main (void) {
    float a;
    int i;
    char s[sizeof(float)];

    printf ("%i\n", sizeof(a));
    a = (float)543.75;

    memcpy(s, &a, sizeof(a));

    for (int i = 0; i < sizeof(float); ++i)
        printf("%x", s[i]);
return 0;
}

/* f = (-1)^s * 1.m * 2^(e-b)
 * -543.75
 * 543 / 2 = 271        Rest 1
 * 271 / 2 = 135        Rest 1
 * 135 / 2 = 67         Rest 1
 * 67 / 2 = 33          Rest 1
 * 33 / 2 = 16          Rest 1
 * 16 / 2 = 8           Rest 0
 * 8 / 2 = 4            Rest 0
 * 4 / 2 = 2            Rest 0
 * 2 / 2 = 1            Rest 0
 * 1 / 2 = 0            Rest 1
 *
 * 10.0001.1111
 *
 * 0.75 * 2 = 1.5       1
 * 0.5 * 2 = 1          1 falsch - nichts
 *
 * 10.0001.1111.1
 * 1,0.0001.1111.1
 * 127 + 9 = 136
 *
 * 136 / 2 = 68         Rest 0
 * 68 / 2 = 34          Rest 0
 * 34 / 2 = 17          Rest 0
 * 17 / 2 = 8           Rest 1
 * 8 / 2 = 4            Rest 0
 * 4 / 2 = 2            Rest 0
 * 2 / 2 = 1            Rest 0
 * 1 / 2 = 0            Rest 1
 *
 * 1000.1000
 * 136 ^= 1000.1000
 *

 1,0.0001.1111.1,11

 |0|1000.1000|1,0.0001.1111.1,11

 |0|10001000|1000011111111

 1100.0100.0100.0011.1111.1100
 1100.0100.0000.0111.1111.1000

 C407F8

*/
Antworten