Question

J'ai une valeur entière unsigned long qui représente un flotteur en utilisant le format IEEE-754. Quel est le moyen le plus rapide d'imprimer dehors comme un flotteur en C ++?

Je sais que d'une façon, mais me demande s'il existe un utilitaire pratique en C ++ qui serait mieux.

Exemple de la façon que je sais est:

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

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

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

(Ceci affiche "valeur flottante est: 5")

Était-ce utile?

La solution

La méthode union que vous avez suggéré est la voie habituelle que la plupart des gens prendraient. Cependant, il est techniquement un comportement non défini en C / C ++ pour lire un autre membre d'un syndicat que celui qui a été le plus récemment écrit. Malgré cela, cependant, il est bien soutenu entre à peu près tous les compilateurs.

pointeurs de casting, comme Jon Skeet suggéré , est une mauvaise idée - qui viole la

Autres conseils

Il ne fonctionne que sur des machines ou des machines 32 bits où sizeof (long) == sizeof (float). Sur les machines modernes que vous pouvez utiliser à la place int ... et vous avez vraiment prendre soin si vous effectuez cette astuce.

Je pensais la même chose que Jon Skeet, mais il me devança. Cependant, je le ferais un peu plus concise que lui.

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

Vous obtenez un pointeur sur votre unsigned long, réinterprètent alors que comme pointeur pour flotter, puis déréférencement votre pointeur pour flotter produit la valeur flottante.

Puisque vous faites cela en C ++, il est plus clair d'utiliser reinterpret_cast au lieu de l'ancien casting C-style.

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

EDIT: Je pensais que cela était déjà « juste méchant », mais il se révèle être pire que je pensais - voir les commentaires pour plus de détails. Je ne recommanderais pas cette approche, mais je le laisse ici pour documenter la possibilité (et la mise en garde!)


Vous pouvez utiliser des pointeurs:

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

(Cela peut se résumer en une seule ligne, mais je pense qu'il est plus clair pas.)

En gros la même chose que votre syndicat ... et tout aussi douteux à moins que vous êtes sûr de la taille des types concernés.

Si votre plate-forme les prend en charge, vous devriez probablement utiliser les noms de type spécifique de taille pour l'entier et flottant types de points.

swegi avait la bonne direction, mais il a manqué un caractère. La manière correcte est

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