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 = 0x3f000000Die 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!
-
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<>.
-
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.