Convertir 4 octets au format IEE 754

Signaler
Messages postés
9
Date d'inscription
samedi 22 mars 2003
Statut
Membre
Dernière intervention
2 mars 2004
-
Messages postés
20
Date d'inscription
vendredi 28 janvier 2005
Statut
Membre
Dernière intervention
14 septembre 2006
-
existe t-il une fonction qui convertit 4 octets (32 bits) en un float dans la norme IEE 754?

6 réponses

Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
26
float f = (float) mylng;
Ne te va pas ?

ciao...
BruNews, Admin CS, MVP Visual C++
Messages postés
9
Date d'inscription
samedi 22 mars 2003
Statut
Membre
Dernière intervention
2 mars 2004

non ça ne va pas du tout :sad)

je vais expliquer plus clairement mon problème:

Je viens de récupérer sur le port série une trame provenant d'un appareil (un analyseur d'Ozone)
Dans cette trame, 4 octets m'intéressent et qui correspondent à la mesure d'ozone.

par exemple: 0x41242331 qui correspond à 10.2 ppb ( concentration d'ozone dans l'air)

mais quand je fais printf("\n mesure:%f \n",(float)0x41242331);, je n'obtiens pas du tout 10.2
Messages postés
584
Date d'inscription
mardi 26 novembre 2002
Statut
Membre
Dernière intervention
29 mai 2015

Essaie ça :
Union ozone
{
float f;
int n;
}

ozone.n = 0x41242331;

printf("%f", ozone.f);

On ne force pas une curiosité, on l'éveille.
.................................................Daniel Pennac
Messages postés
584
Date d'inscription
mardi 26 novembre 2002
Statut
Membre
Dernière intervention
29 mai 2015

Euh...

Union Ozone
{
float f;
int n;
}

Ozone ozone;

ozone.n = 0x41242331;

printf("%f", ozone.f);

On ne force pas une curiosité, on l'éveille.
.................................................Daniel Pennac
Messages postés
9
Date d'inscription
samedi 22 mars 2003
Statut
Membre
Dernière intervention
2 mars 2004

:)

cool au moins ça marche!

j'ai comprit l'union permet au deux variables d'utiliser le même espace mémoire.

ça m'a inspirer alors j'ai fait ça:

float a;
unsigned long int *b;
b=&a;

*b=0x41242331;
printf("\n mesure:%f \n",a); cool j'obtiens aussi 10.2....

:question) Par contre j'ai 3 soucis:
1) b=&a; provoque un warning car les 2 types ne sont pas compactibles ( comment le caster?)

2) pourquoi peut on lire printf(" 0x%.8x ",*b) la valeur hexa de b ( b étant un entier)
mais pas pouvoir lire printf(" 0x%.8x",a); a étant un float;

j'ai essayé printf(" 0x%.8x",3.14); je n'arrive pas a voir la valeur hexa de 3.14

c'est peut être bete mais je voudrait bien comprendre pourquoi!

3) et dernière interrogation:
Pourquoi je n'obtiens donc pas 10.2.... avec le code en dessous? ( comme a voulu m'aider BruNews)
float c;
c=0x41242331;
printf("%f",c);
Messages postés
20
Date d'inscription
vendredi 28 janvier 2005
Statut
Membre
Dernière intervention
14 septembre 2006

Bonjour,

Voila une solution qui marche et qui ne fais hurler le compilateur ; de plus c'est plus propre que l'union



unsigned char floatinbyte[sizeof(float)]; // ou char ca marche aussi
float f;

//Copie d'une zone mémoire vers une autre ; 4 <=> sizeof(float)
memcpy(&f, floatinbyte,
sizeof(4));

Gwen