IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage C++ Discussion :

fonction 4 octets en float


Sujet :

Langage C++

  1. #1
    Membre du Club
    Inscrit en
    Mars 2011
    Messages
    62
    Détails du profil
    Informations forums :
    Inscription : Mars 2011
    Messages : 62
    Points : 48
    Points
    48
    Par défaut fonction 4 octets en float
    Bonjour,

    Comme l'indique l'intitulé, j'aimerai savoir s'il existe une méthode pour convertir 4 octets en un float. Pour être plus claire.

    J'ai 4 variables qui récupère 4 octets.

    Mais ces octets sont en fait, un réel à virgule flottante codé sur 32 bits (4 octets je me répète...).

    Existe il une méthode/fonction qui permet cette conversion? Je pense qu'il est possible d'interpréter ces valeurs pour arriver au résultat via un code, mais s'il y a des gens une fonction déstinée...

    Merci d'avance pour vos réponses.

  2. #2
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 860
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 860
    Points : 219 064
    Points
    219 064
    Billets dans le blog
    120
    Par défaut
    Bonjour,

    La seule méthode à laquelle je pense:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    unsigned char o1;
    unsigned char o2;
    unsigned char o3;
    unsigned char o4;
     
    // Remplissage des variables 
     
    float f = o1 << 24 | o2 << 16 | o2 << 8 | o4;
    Je ne doute pas qu'il manque des cast et peut être même des parenthèses, mais le principe est là.
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  3. #3
    Membre du Club
    Inscrit en
    Mars 2011
    Messages
    62
    Détails du profil
    Informations forums :
    Inscription : Mars 2011
    Messages : 62
    Points : 48
    Points
    48
    Par défaut
    Merci, effectivement l'idée est là je pense aussi.. Mais en revanche, je n'ai pas le bon résultat. Tu pourrais m'expliquer ton code afin que je puisse la modifier pour avoir le bon résultat?

  4. #4
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 860
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 860
    Points : 219 064
    Points
    219 064
    Billets dans le blog
    120
    Par défaut
    Les '<<' décalent les bits vers la gauche
    Les '|' font un OR binaire.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    float f =((float)o1 << 24) | ((float)o2 << 16) | ((float)o2 << 8) | (float)o4;
    Peut être que cela est mieux (pour que le décalage de bits, ne perdent pas de bit à cause d'être sur un octet et non 4.
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  5. #5
    Membre du Club
    Inscrit en
    Mars 2011
    Messages
    62
    Détails du profil
    Informations forums :
    Inscription : Mars 2011
    Messages : 62
    Points : 48
    Points
    48
    Par défaut
    J'ai testé et ça ne marche pas...

    error: invalid operands of types 'float' and 'int' to binary 'operator<<'|

    Je pense qu'on ne peut pas faire d'opération | sur des float. Je pense que l'erreur est là.

  6. #6
    screetch
    Invité(e)
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    union
    {
      char bytes[4];
      float v;
    };

  7. #7
    Membre du Club
    Inscrit en
    Mars 2011
    Messages
    62
    Détails du profil
    Informations forums :
    Inscription : Mars 2011
    Messages : 62
    Points : 48
    Points
    48
    Par défaut
    Euh merci pour l'info, mais je ne suis pas une perle en C++. Est ce que tu pourrais m'expliquer/commenter? Parce que ça ne m'avance à pas grand chose juste le code à mon niveau...

  8. #8
    screetch
    Invité(e)
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    #include <cstdio>
     
    union BytesToFloat
    {
        unsigned char   bytes[4];
        float           value;
    };
     
    int main()
    {
        BytesToFloat converter;
        converter.value = 1.0f;
        for(int i = 0; i < 4; ++i)
        {
            printf("%d:%02x\n", i, converter.bytes[i]);
        }
    }
    une union utilise le même espace mémoire pour stocker tous ses members
    donc ici le float et le tableau d'unsigned char seront au même endroit.
    En affectant une valeur a value, on change aussi le tableau d'unsigned char.
    Et vice versa.

  9. #9
    Membre du Club
    Inscrit en
    Mars 2011
    Messages
    62
    Détails du profil
    Informations forums :
    Inscription : Mars 2011
    Messages : 62
    Points : 48
    Points
    48
    Par défaut
    Tout cela à l'air logique, mais cette méthode ne fonctionne pas non plus. J'obitens des résultats bizarres.

  10. #10
    Expert confirmé Avatar de fregolo52
    Homme Profil pro
    Développeur C
    Inscrit en
    Août 2004
    Messages
    2 364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Août 2004
    Messages : 2 364
    Points : 5 378
    Points
    5 378
    Par défaut
    Tu peux nous monter ce que tu as fait ?

  11. #11
    Membre du Club
    Inscrit en
    Mars 2011
    Messages
    62
    Détails du profil
    Informations forums :
    Inscription : Mars 2011
    Messages : 62
    Points : 48
    Points
    48
    Par défaut
    Voici ma fonction et le union :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     union BytesToFloat
    {
        unsigned char   bytes[4];
        float           value;
    };
     
    float getR4(std::ifstream& fichier)
    {
        BytesToFloat result;
     
            result.bytes[0] = getOctet(fichier);
            result.bytes[1] = getOctet(fichier);
            result.bytes[2] = getOctet(fichier);
            result.bytes[3] = getOctet(fichier);
     
        return result.value;
    }

    et ma fonction getOctet qui li le fichier binaire. Fonction qui ne m'a jamais posé de problème jusqu'à maintenant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     int getOctet(std::ifstream& fichier){
        uint8_t xin;
        fichier.read(reinterpret_cast<char*>(&xin), sizeof(uint8_t));
        return int(xin);}

  12. #12
    screetch
    Invité(e)
    Par défaut
    essayes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
            result.bytes[3] = getOctet(fichier);
            result.bytes[2] = getOctet(fichier);
            result.bytes[1] = getOctet(fichier);
            result.bytes[0] = getOctet(fichier);

  13. #13
    Membre du Club
    Inscrit en
    Mars 2011
    Messages
    62
    Détails du profil
    Informations forums :
    Inscription : Mars 2011
    Messages : 62
    Points : 48
    Points
    48
    Par défaut
    Je l'avais déjà testé aussi. Dans mon programme je détecte de quel type d'endian il s'agit.

  14. #14
    screetch
    Invité(e)
    Par défaut
    j'avoue que je ne sais pas. Chez moi ca marche (tm)
    ca donne quoi comme résultat? un float tout a fait étrange ou bien...?

  15. #15
    Membre du Club
    Inscrit en
    Mars 2011
    Messages
    62
    Détails du profil
    Informations forums :
    Inscription : Mars 2011
    Messages : 62
    Points : 48
    Points
    48
    Par défaut
    Bon en fait, ça marche cette méthode. Je viens de me rendre compte que c'était les bons résultats. Je ne l'avais pas remarqué parce que les valeurs sont très arrondi. Typiquement :

    1.879273e+001->18
    9.975771e-001->0
    5.46032e+006->5.46032e+006


    Mais ce qui est dommage, c'est la précision, ce n'est que pour les grand nombres que j'ai une précision, sinon il arrondi très facilement..

    Il y a un moyen de régler ce problème?

  16. #16
    screetch
    Invité(e)
    Par défaut
    il semble y avoir une erreur sur les chiffres après la virgule, a mon avis un des octets n'est pas bon dans ton programme.

  17. #17
    Membre du Club
    Inscrit en
    Mars 2011
    Messages
    62
    Détails du profil
    Informations forums :
    Inscription : Mars 2011
    Messages : 62
    Points : 48
    Points
    48
    Par défaut
    Je t'avoue que c'est assez curieux. Car pour cette valeur :
    5.46032e+006
    J'ai le bon résultat contrairement aux autres qui sont justes mais arrondies. J'ai du mal à diagnostiquer le problème puisque les octets sont bien récupérés...

  18. #18
    screetch
    Invité(e)
    Par défaut
    il me semblerait que seuls 2 ou 3 octets soient remis correctement.
    peux tu afficher les octets pour les valeurs qui ne marchent pas?

  19. #19
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    La méthode avec union utilise un comportement indéterminé. Ça peut échouer sur certains compilateurs (je ne sais pas s'il y en a où ça échoue en pratique, et je sais que visual C++ a décidé de supporter ce comportement).

    C'est pourquoi je préfère celle à base d'opérateurs binaires.
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  20. #20
    Membre chevronné
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Points : 2 205
    Points
    2 205
    Par défaut
    Citation Envoyé par JolyLoic Voir le message
    La méthode avec union utilise un comportement indéterminé.
    char (et unsigned char) sont des cas spéciaux, c'est autorisé et c'est pas une UB. (ouai fin, la conversion marche que dans un sens du coup)
    "Hardcoded types are to generic code what magic constants are to regular code." --A. Alexandrescu

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Dégrossir ma fonction qui lit des floats.
    Par disturbedID dans le forum C
    Réponses: 6
    Dernier message: 16/04/2007, 02h08
  2. Conversion float -> n octets
    Par Fabllot dans le forum C
    Réponses: 4
    Dernier message: 22/05/2006, 20h00
  3. octet en double ou en float ??
    Par lykim dans le forum Langage
    Réponses: 16
    Dernier message: 16/05/2006, 23h43
  4. fonction qui transforme un entier en octet
    Par personne64 dans le forum C
    Réponses: 43
    Dernier message: 10/05/2006, 15h36
  5. Réponses: 27
    Dernier message: 13/01/2006, 23h46

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo