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

C++Builder Discussion :

float et IEEE


Sujet :

C++Builder

  1. #1
    Membre extrêmement actif Avatar de petitours
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Février 2003
    Messages
    2 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 2 037
    Par défaut float et IEEE
    Bonjour,

    Je cherche un petit logiciel capable de me donner la valeur des différents octets qui constituent un float ou un double suivant la norme IEEE754.

    Etant donné que je ne trouve pas et que c'est un peu compliqué à faire, je me demande s'il ne serait pas trés facile grace à Bcb d'aller lire un à un les 4 octets d'un float dont l'espace est forcément réservé en mémoire...

    un truc du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    float lenombre = 5.6 ;
     
    char octet1 = lenombre[1] ;
    char octet2 = lenombre[2] ;
    Ca vous parait possible ?
    si oui comment peut on accéder à ces octets, indépendament ?
    Merci beaucoup

  2. #2
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Plusieurs manières.

    Avec un champ de bit et une 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 Float
    {
        float f;
     
        struct
        {
            unsigned char Bit1 : 1,
                          Bit2 : 1,
                          ...,
                          Bit8 : 1;
        } Bits[4];
    };
     
    Float MyFloat;
    MyFloat.f = 2569.365f;
     
    int bit6 = MyFloat.Bits[0].Bit1;
    Avec les opérateurs bits à bits :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    float f = 2569.365f;
     
    int bit6 = (*reinterpret_cast<int*>(&f) & (1 << 6)) >> 6;
    Avec les bitsets :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    #include <bitset>
     
    float f = 2569.365f;
    std::bitset<32> Bits(*reinterpret_cast<int*>(&f));
     
    int bit6 = Bits[6];
    Pas testé, mais ça devrait être ça.

  3. #3
    Membre extrêmement actif Avatar de petitours
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Février 2003
    Messages
    2 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 2 037
    Par défaut
    merci beaucoup !

    J'ai mis du temps avant de faire marcher tout ca et d'esssayer de comprendre...désolé de remercier si tard !

    J'arrive à faire fonctionner les deux premières solutions mais je ne comprends pas ce que je fais et je n'arrive donc pas à modifier quoi que ce soit ! j'arrive à retouver des choses sur les structures dans la litérature mais rien sur les unions et encore moins sur les "*reinterpret_cas rotudijuhklsfdffsj"

    Pour ces opérateurs bit à bit vous mettez dans votre exemple deux fois plus de code que ce que présente la synthaxe de l'aide Bcb ! je suis perdu !


    Pour la dernière solution avec les bitsets, pas moyen de faire fonctionner !
    le compilateur me met une erreur E2021 et s'arrète sur la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    _WordT _M_w[_Nw];                // 0 is the least significant word.
    dans bitset.h

    Ceci dit je pense que la solution structure + union est la plus interessante pour moi, je pense qu'elle peut me permettre de convertir tout ce que je veux en octets, bits à bit, hexa etc facilement.
    Je suppose que c'est un outil paratique pour manipuler les bits d'un octet, chose que je serai ammené à faire dans le futur.

    si vous aviez des orientations à me donner au sujet des unions ce serait formidable !

    Merci mille fois pour votre aide

  4. #4
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    si vous aviez des orientations à me donner au sujet des unions ce serait formidable !
    Le principe des unions est très simple : tous leurs champs partagent le même espace mémoire. Conséquence, la taille d'une union n'est pas la somme de la taille de ses membres, mais leur maximum. Ainsi la donnée de type float et les tableaux de bits partagent les mêmes bits, ce qui permet d'accéder à ceux-ci sous la forme que tu préfères (en l'occurence le float pour l'écriture, et les tableaux de bits pour la lecture).

    ...et encore moins sur les "*reinterpret_cas rotudijuhklsfdffsj"
    reinterpret_cast est l'un des 4 casts du C++ (càd que tu aurais pu le remplacer par un bon vieux cast style C, cela aurait tout aussi bien fonctionné). Il permet de caster deux types de pointeurs / références n'ayant rien à voir entre eux. En gros, tu dis au compilo "je sais que ce pointeur pointe vers un float, mais j'aimerais que tu fasses comme s'il s'agissait d'un entier". C'est nécessaire pour utiliser les opérateurs bit à bit, car ceux-ci ne s'utilisent que sur des entiers. Voilà, j'espère que tu comprends un peu mieux maintenant

    Enfin, personnellement je préfère la solution du bitset. std::bitset est justement fait pour manipuler des champs de bits, il ne faut pas s'en priver. Par contre ça ne fonctionnera évidemment que pour des entiers.

  5. #5
    Membre extrêmement actif Avatar de petitours
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Février 2003
    Messages
    2 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 2 037
    Par défaut
    re merci pour vos explications !

    Aprés un peu de travail j'arrive à manipuler les unions et les structures d'union sans trop de mal ; Ca fait au moins ce que je veux...

    C'est un outil qui doit etre souvent pratique pour traiter des données

    Merci beaucoup

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 1
    Dernier message: 01/06/2007, 10h48
  2. Interprétation d'un float IEEE
    Par PilouPilou dans le forum C
    Réponses: 2
    Dernier message: 30/09/2006, 13h44
  3. Pb de formatage de champs de type float
    Par FrankyNormand dans le forum XMLRAD
    Réponses: 9
    Dernier message: 05/05/2005, 12h37
  4. [7RC3] Formatage de champs float
    Par Sylvain Leray dans le forum XMLRAD
    Réponses: 2
    Dernier message: 19/05/2003, 09h38
  5. probleme d'insertion d'un Float
    Par neness dans le forum Débuter
    Réponses: 3
    Dernier message: 07/01/2003, 12h32

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