2 Int in 1 Float umwandeln



  • Hallöchen,

    Ich habe folgendes Problem:
    Ich habe 2 Integer gegeben, von denen jeweils die untersten 16 Bit genutzt werden.
    Die beiden 16 Bit Werte zusammen ergeben mir meine Binärdarstellung des Float-Wertes.

    Wie bekomme ich nun den Compiler dazu diese 32 bit als Float zu interpretieren.

    int var1=0x3f00;
    int var2=0x0000;
    int binaerdarstellung = (var1<<16)|var2;
    // binaerdarstellung = 0x3f000000
    

    Die Zeile
    float ergebnis = (float) binaerdarstellung;
    bringt mich nicht zum gewünschten ergebnis von 0,5.

    Hat jemand zufälig eine Idee wie man das machen könnte, ausgehend von den 2 Integervariablen?



  • In den int-Werten steht die binäre Repräsentation des float, oder wie? In dem Fall solltest du dir mal reinterpret_cast<> ansehen. (aber besonders portabel ist so ein Ansatz in keinem Fall)



  • float f = *(reinterpret_cast<float*>(&binaerdarstellung));
    

    Aber wie gesagt, unportabel!


  • Mod

    int var1=0x3f00;
    int var2=0x0000;
    int binaerdarstellung = (var1<<16)|var2;
    // binaerdarstellung = 0x3f000000
    
    float f;
    // entweder
    memcpy(&f,&binaerdarstellung,sizeof f);
    

    Das ist portabel unter den gegebenen Voraussetzungen. Endianess spielt keine Rolle, da sie für Quelle und Ziel logischerweise gleich sein muss. Gewöhnt euch ab, überhaupt erst an reinterpret_cast zu denken, wenn schon auf Portabilität hingewiesen werden soll.



  • camper schrieb:

    Gewöhnt euch ab, überhaupt erst an reinterpret_cast zu denken, wenn schon auf Portabilität hingewiesen werden soll.

    memcpy() ist genauso gut oder schlecht wie der ansatz über reinterpret_cast<>.


  • Mod

    CStoll schrieb:

    camper schrieb:

    Gewöhnt euch ab, überhaupt erst an reinterpret_cast zu denken, wenn schon auf Portabilität hingewiesen werden soll.

    memcpy() ist genauso gut oder schlecht wie der ansatz über reinterpret_cast<>.

    keineswegs. Die Probleme gehen bei alignment los und hören bei Verletzung der Alias-Regeln nicht auf. Im Gegensatz dazu begnügt sich memcpy mit Fragen der Repräsentation - die war aber schon gegeben.


Anmelden zum Antworten