Problem mit Konvertierung float -> long -> float



  • Hallo

    Warum funktioniert der Code nicht wenn der Nachkommateil von f etwa > .4 ist?
    Und wie kann man ihn zum Funktionieren brigen?

    float f = 40.4f;
    long result = *reinterpret_cast<long*>(&f);
    result = swap32(result); // Swap32 vertauscht die Bytes einer 32-Bit-Variablen.
    result = swap32(result);
    f = *reinterpret_cast<float*>(&result);
    std::cout << f << std::endl;
    

    Eigentlich erwartet man dass f bei der Ausgabe auch den Wert von 40.4 hat aber bei mir steht da -1.#QNAN

    Das Problem tritt auch bei C-Casts. Also wenn ich z.b. ((long)&f) schreibe. Nur tritt es erst bei höherem Nachkommawert auf.

    Quelltext von swap32: Ich nehme mal an dass er funktioniert. Habe ihn aus dem SDL-Quelltext.

    inline long swap32(long x)
    {
       return (x<<24) | ((x<<8) & 0x00FF0000) | ((x>>8) & 0x0000FF00) | (x>>24);
    }
    

    Als Compiler benutze ich mingw (gcc) 3.4.5


  • Mod

    ich kann mir nie merken, ob >> arithmetisch oder logisch durchgeführt wird (der standard schreibt es nicht vor) - das ist einer der gründe, warum ich grundsätzlich shift-operatioonen mit vorzeichenbehafteten zahlen aus dem weg gehe. wenn >> arithmetisch arbeitet, ist das beschriebene verhalten jedenfalls nicht verwunderlich. fürhre das ganze mit vorzeichenlosen typen aus und komm dann wieder 🙂



  • Es funktioniert!!! Danke, du bist mein Retter. 🙂 🙂 🙂

    Jetzt kann ich mich beruhigt schlafen legen.


Anmelden zum Antworten