Float Zahl auseinander nehmen.



  • Ich will alle vier Bytes einer float Zahl in einen vier Bytes großen char array einlesen. Das ist mein Ansatz, nur ich glaub der ist falsch, aber ich weis nicht was. 😕

    float zahl=20.1;
            float *ptr;
    
            char a[3];
    
            ptr = &zahl;
    
            for (int i=0;i < 4;i++)
            {
                    a[i]=(char)ptr;
                    ptr++;
            }
    


  • dein problem ist, dass ptr bei dir vom typ float* ist und ptr++ daher um sizeof(float) (=4) weiterzählt statt um 1. außerdem is dein array a nur 3 elemente groß statt 4 😉

    float zahl = 20.1f;
    char *ptr = reinterpret_cast<char*>(&zahl);
    char a[4];
    
    for( int i = 0; i < 4; i++ )
      a[i] = *ptr++;
    

    alternativ gings auch so:

    union
    {
       float zahl;
       char a[4];
    }
    
    zahl = 20.1f;
    


  • so ist's doch viel einfacher

    float zahl=20.1;
    char a[sizeof(float)];
    
    *(float*)a = zahl;  // <-- keine schleife nötig
    

    🙂



  • Gut. Ich wollte nun aus der float Zahl einmal Ziffern, Exponent und Vorzeichen herausfiltern
    [ S ][Exponent][mantrissa]
    32 31|30 23|22 0

    http://chrishecker.com/images/f/fb/Gdmfp.pdf
    S. 21

    Ich hab das nun so herausgefiltert, aber das scheint irgendwie falsch zu sein 😕

    float zahl=20.1;
            char *ptr = reinterpret_cast<char*>(&zahl);
            char a[4];
            int b[4],e,s,te;
    
            for (int i=0;i < 4;i++)
            {
                    a[i] = *ptr ;
                    b[i]=a[i]; //sicher stellen, dass 1 Byte Zahl
                    ptr++;
            }
            e=a[2]&128;   //nur das letzte Bit
            e =e>> 7;     // 7 Bits nach rechts schieben
    
            s=a[3]&128;   //vorzeichen Bit
            s=s >> 7;     //nur noch 1 oder 0 möglich
    
            te=a[3]|128;  //100% setzen
            te=a[3]^128;  //Bit wegmachen  (xor)
            te << 1;      //mal 2
    
            e = e + te;   //end exponent
    

    Und noch eine Frage zusätzlich wie ist die Basis für den Exponent.



  • Hauke schrieb:

    Ich hab das nun so herausgefiltert, aber das scheint irgendwie falsch zu sein

    benutzt du einen x86-PC?
    dort sind die bytes falsch herum gespeichert, d.h. bit 31 ist dort, wo du das bit 7 erwarten würdest.

    Hauke schrieb:

    Und noch eine Frage zusätzlich wie ist die Basis für den Exponent.

    2



  • float x = -2.0f;#
      int xi = *reinterpret_cast<int*>(&x);
    
      int s = xi >> 31;
      int e = (xi << 8) >> 23;
      int m = xi & 0x803FFFFF;
    

    ich würds so in der art versuchen.



  • Das mit den umgedrehten Bytes weis ich, aber ich weis nicht wie c++ das genau verwaltet und wenn ich die Bytes umdrehe gefallen mir die Zahlen noch weniger oder ich interpretiere die werte, die herauskommen falsch.

    e=a[1]&128;   //nur das letzte Bit       vorher 2
            e =e>> 7;     // 7 Bits nach rechts schieben
    
            s=a[0]&128;   //vorzeichen Bit           vorher 3
            s=s >> 7;     //nur noch 1 oder 0 möglich
    
            te=a[0]|128;  //100% setzen              vorher 3
            //fehler war hier noch drin sonst macht die oberre Zeile kein Sinn
            te=te^128;    //Bit wegmachen  (xor)     vorher 3
            te << 1;      //mal 2
    
            e = e + te;   //end exponent
    

Anmelden zum Antworten