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 Discussion :

convertir les nombres réels , float en binaire


Sujet :

C

  1. #1
    Nouveau Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Décembre 2015
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 28
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Décembre 2015
    Messages : 9
    Points : 0
    Points
    0
    Par défaut convertir les nombres réels , float en binaire
    salut , SVP aidez moi pour commencer à resoudre ce probleme parceque vraiment j'ai aucune aidée sur ça :

    ecrir un programme qui affiche un nombre réel, float en binaire c-à-d sa représentation binaire en memoire
    le nombre réel et lu au clavier sa representation est affiche selon le format :
    signe ,espace, exposant , espace mentisse(par bloc de 4chiffres)

  2. #2
    Responsable Systèmes


    Homme Profil pro
    Gestion de parcs informatique
    Inscrit en
    Août 2011
    Messages
    17 437
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Gestion de parcs informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Août 2011
    Messages : 17 437
    Points : 43 078
    Points
    43 078
    Par défaut
    Nous ne sommes pas là pour faire tes exercices.

    Nous pouvons t'aider si tu bloques sur certains points. Montres-nous le code ou tu bloques.
    Ma page sur developpez.com : http://chrtophe.developpez.com/ (avec mes articles)
    Mon article sur le P2V, mon article sur le cloud
    Consultez nos FAQ : Windows, Linux, Virtualisation

  3. #3
    Invité
    Invité(e)
    Par défaut
    Du point de vue théorique, l'encodage binaire des nombres flottants suit la norme IEEE 754 : https://fr.wikipedia.org/wiki/IEEE_754
    Tu as déjà les informations théoriques quoi "où trouver les informations demandé" grâce à ce lien.

    Ensuite, il faut pouvoir "extraire" ces données d'un nombre réels...
    Pour cela, je pense que l'opérateur SHIFT ( << ou >> ) peut t'aider : https://en.wikipedia.org/wiki/Bitwis...hift_operators

    A partir de cela, je pense que tu as de quoi faire...

  4. #4
    Expert éminent
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 565
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 565
    Points : 7 648
    Points
    7 648
    Par défaut
    Bonjour,

    Il est forcément primordial de connaître le format IEEE pour traiter ton problème.
    Ensuite, il te faut poser la méthode.
    Suivant ton niveau de connaissance, le problème peut être abordé par des méthodes différentes :
    * Les flottants sont déjà en format IEEE en mémoire, on peut peut-être les extraire directement (en utilisant les masquages de bits ou les unions ayant des champs de bits)
    * voir s'il existe des fonctions dans les bibliothèques qui à partir d'un flottant retournent les éléments demandés (cela existe mais est-ce que la difficulté de l'exercice n'est pas contournée!)
    * à partir d'un nombre flottant, essayer d'appliquer des opérations pour en extraire les éléments. (par exemple avec log() on peut trouver l'exposant,...)
    * une méthode basée en 2 temps sur la conversion d'un flottant en chaîne, puis l'extraction dans la chaîne des constituants. Peut-être la plus facile à comprendre en débutant même si obtenir un résultat exact devient complexe.

    A toi de voir, parmi les pistes données celle qui correspond à tes connaissances actuelles.

  5. #5
    Membre habitué Avatar de Abacar94
    Homme Profil pro
    L2 Math-informatique
    Inscrit en
    Novembre 2015
    Messages
    103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Niger

    Informations professionnelles :
    Activité : L2 Math-informatique

    Informations forums :
    Inscription : Novembre 2015
    Messages : 103
    Points : 133
    Points
    133
    Par défaut
    Citation Envoyé par narimenedjebbar Voir le message
    salut , SVP aidez moi pour commencer à resoudre ce probleme parceque vraiment j'ai aucune aidée sur ça :

    ecrir un programme qui affiche un nombre réel, float en binaire c-à-d sa représentation binaire en memoire
    le nombre réel et lu au clavier sa representation est affiche selon le format :
    signe ,espace, exposant , espace mentisse(par bloc de 4chiffres)
    En faite es que tu a un début de code ou bien un début d'idée ?

  6. #6
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Septembre 2017
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 25
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2017
    Messages : 1
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par dalfab Voir le message
    Bonjour,

    Il est forcément primordial de connaître le format IEEE pour traiter ton problème.
    Ensuite, il te faut poser la méthode.
    Suivant ton niveau de connaissance, le problème peut être abordé par des méthodes différentes :
    * Les flottants sont déjà en format IEEE en mémoire, on peut peut-être les extraire directement (en utilisant les masquages de bits ou les unions ayant des champs de bits)
    * voir s'il existe des fonctions dans les bibliothèques qui à partir d'un flottant retournent les éléments demandés (cela existe mais est-ce que la difficulté de l'exercice n'est pas contournée!)
    * à partir d'un nombre flottant, essayer d'appliquer des opérations pour en extraire les éléments. (par exemple avec log() on peut trouver l'exposant,...)
    * une méthode basée en 2 temps sur la conversion d'un flottant en chaîne, puis l'extraction dans la chaîne des constituants. Peut-être la plus facile à comprendre en débutant même si obtenir un résultat exact devient complexe.

    A toi de voir, parmi les pistes données celle qui correspond à tes connaissances actuelles.
    quelles sont les opérations pour extraire ces éléments ? si non comment faire pour la conversion en chaînes ?

  7. #7
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 630
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 630
    Points : 10 556
    Points
    10 556
    Par défaut
    Il faut utiliser les opérateurs logiques &, |, <<, >>


    Exemple pour un nombre entier :
    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
    18
    int main(int argc, char** argv)
    {
        int mask = 0x8000000;
     
        int number = 79755; // 0x1378B, 10011011110001011
     
        for(; mask >= 1; mask >>= 1) {
            if ((number & mask) == mask) {
                printf("1");
            } else {
                printf("0");
            }
        }
     
        printf("\n");
     
        return 0;
    }

  8. #8
    Expert éminent
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 565
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 565
    Points : 7 648
    Points
    7 648
    Par défaut
    Bonjour,

    Des données de l'exercice sont manquantes "L'exposant est à indiquer en binaire, mais est-ce l'exposant base 2 ou base 10 du nombre?", "La mantisse binaire est-elle un nombre à virgule ou un nombre entier?".
    On ne donne pas cet exercice sans donner une piste de départ.

    Ainsi si on souhaite un exposant base 2 et une mantisse à virgule, on peut partir de la fonction frexp() qui fournit cette décomposition
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    float nombreADecomposer = 0.2f;
    int exposantB2;
    float mantisse = frexp( nombreADecomposer , &exposantB2 );
    Là, l'"apparente difficulté" est de convertir la mantisse flottante en affichage binaire. C'est une méthode peu utilisée mais que je préfère.

    Si on souhaite un exposant base 10, on peut partir d'une chaîne en base 10 fournie par la fonction sprintf().
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    float nombreADecomposer = 0.2f;
    char buffer[20];
    sprintf( buffer , "%.7e" , nombreADecomposer );
    Ici, il va falloir d'abord extraire de la chaîne trouvée la mantisse et l'exposant, pour finalement les décoder en binaire.

    Si on part du fait que les float sont stockés en format IEEE754, on aura les éléments en partant d'un trans-typage "astucieux" (on suppose donc ici une recherche de l'exposant base 2).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    float nombreADecomposer = 0.2f;
    //
    uint32_t equiv = *(uint32_t*)&nombreADecomposer;
    // ou bien
    union {
        float    nbf;
        uint32_t nbe;
    };
    nbf = nombreADecomposer;
    uint32_t equiv = nbe;
    Ce point de départ a mis les 32 bits qui contiennent le signe, l'exposant et la mantisse IEEE dans l'entier equiv. Par des masquages (ou en utilisant des champs de bits) on pourra extraire ces trois valeurs et les afficher en binaire.

Discussions similaires

  1. Convertir des nombres (hexadecimal, decimal, octal, binaires)
    Par AASProni dans le forum Codes sources à télécharger
    Réponses: 2
    Dernier message: 19/05/2014, 17h39
  2. Gérer les nombres réels pour script shell
    Par Bil'0x dans le forum Shell et commandes GNU
    Réponses: 9
    Dernier message: 16/07/2013, 11h25
  3. Réponses: 1
    Dernier message: 05/12/2011, 10h25
  4. [LG] Convertir un nombre binaire en décimal
    Par minela28x dans le forum Langage
    Réponses: 5
    Dernier message: 05/01/2006, 10h33

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