L'une des deux réponses précédentes doit être incorrecte, car la question est sous-spécifiée. Nous devons savoir si la structure contient la représentation binaire des composants flottants IEEE ou si elle contient une définition numérique.
Basé sur le fait qu'ils sont des nombres entiers, la première est plus probable: -4,2 serait représenté comme {1,0x81,0x066666}
ou 0xC0866666
. Dans ce cas, la réponse de @ ouah est correcte, et @ pmg donnera 2.85e44. Par contre, pour que le code de @ pmg soit correct, la structure de -4.2 devrait être stockée sous {-1,-21,0x433333}
. Et puis l'application de l'algorithme de @ ouah donne 0xF5C33333
qui est -4.9489e32 lorsqu'il est interprété comme un flottant IEEE.
Si nous supposons que vous utilisez la première représentation, il y a une astuce de processeur non portable qui peut simplifier votre code. Redéfinissez votre structure en tant que syndicat comme suit.
union flt {
struct ieee754 {
unsigned int mantissa:23;
unsigned int exponent:8;
unsigned int sign:1;
} raw;
float f;
}
(Vous pourriez avoir besoin d'inverser l'ordre des arguments en fonction de votre procesor - et assurer l'emballage est correct - c'est la partie non-portable)
Maintenant, votre code peut écrire directement à la mémoire bits et le relire comme flottants:
union flt num;
num.raw.sign = 1;
num.raw.exponent = 129;
num.raw.mantissa = 0x66666;
printf("%f", num.f); //prints 4.2
L'identificateur '__ieee754' (tous les identificateurs commençant par' __') est réservé à l'implémentation. Je suggère que vous utilisiez un autre nom pour le bien de la portabilité. – pmg