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
-
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.