Frage

Ich habe einen unsigned long Integer-Wert, der einen Schwimmer mit IEEE-754-Format darstellt. Was ist der schnellste Weg, um es auszudrucken als Schwimmer in C ++?

Ich kenne einen Weg, aber frage mich, ob es ein praktisches Dienstprogramm in C ++, die besser sein würde.

Beispiel für die Art und Weise, die ich weiß, ist:

union
{
    unsigned long ul;
    float f;
} u;

u.ul = 1084227584; // in HEX, this is 0x40A00000

cout << "float value is: " << u.f << endl;

(Dieser druckt "float-Wert: 5")

War es hilfreich?

Lösung

Die Vereinigung Methode vorgeschlagen ist der üblicher Weg, dass die meisten Menschen nehmen würden. Allerdings ist es technisch nicht definiertes Verhalten in C / C ++ ein anderes Mitglied aus einer Vereinigung als das lesen, die zuletzt geschrieben wurde. Trotz dieser, ist unter so ziemlich alle Compiler es allerdings gut unterstützt.

Casting Zeiger, wie Jon Skeet vorgeschlagen , ist eine schlechte Idee - das ist die

Andere Tipps

Es wird nur funktionieren, auf 32-Bit-Maschinen oder Maschinen, bei denen sizeof (long) == sizeof (float). Auf modernen Maschinen sollten Sie int statt verwenden ... und Sie wirklich darauf achten, wenn Sie diesen Trick gerade ausführen.

Ich war das gleiche wie Jon Skeet denken, aber er hat mich zu ihm. Allerdings würde ich es tun, ein wenig prägnanter als er.

cout << "float value is: " << *((float *) &ulValue)) << endl;

Sie einen Zeiger auf Ihre unsigned long bekommen, dann neu zu interpretieren, dass als Zeiger zu schweben, dann Zeiger Dereferenzierung den float-Wert zu schweben produziert.

Da Sie dies in C ++ tun, es klarer ist reinterpret_cast anstelle des alten C-Casts zu verwenden.

cout << "float value is: " << *(reinterpret_cast<float *>(&ulValue)) << endl;

EDIT: Ich dachte vorher war „nur böse“, aber es stellt sich heraus, schlechter zu sein, als ich dachte - die Kommentare für Details. Ich würde diesen Ansatz nicht empfehlen, aber ich verlasse es hier die Möglichkeit, zu dokumentieren (und den Vorbehalt!)


Sie können Zeiger verwenden:

long ul = 1084227584;
float* fp = (float*) &ul;
float f = *fp;

(Dies kann in eine einzige Zeile kondensiert werden, aber ich denke, es ist klarer nicht.)

Im Grunde das gleiche wie Ihre Gewerkschaft ... und ebenso vertrackt, wenn Sie von den beteiligten Größen der Typen sind sicher.

Wenn Ihre Plattform unterstützt sie, haben Sie wahrscheinlich die größenspezifischen Typnamen sowohl für die Integer- und Floating-Point-Typen verwenden sollten.

swegi hatten die richtige Richtung, aber verpassten ein Zeichen. Der richtige Weg ist

long l = 1084227584L
float f = reinterpret_cast<float&>(l);
scroll top