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 :

Partie décimale d'un float


Sujet :

C

  1. #21
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 452
    Par défaut
    Citation Envoyé par dré kam Voir le message
    Oui mais si les nombres sont en binaires (comme dans la mantisse) et qu'on veut les afficher en décimal?
    As-tu essayé le code que je viens de te proposer ?

    À ton avis, en quel format est codé le nombre i ?

  2. #22
    Membre très actif
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    247
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Janvier 2011
    Messages : 247
    Par défaut
    J'obtiens 75834 soit le nombre à l'envers. Ce que je veux dire, c'est que depuis dans mon code je manipule directement les valeurs de la mantisse. Donc je n'aurais pas de chiffres supérieurs à 1 parce que je fais:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    	manti=(n)&(0x007FFFFF); //Je récupère la mantisse
    Est ce que tu veux dire que c'est comme si ça s reconvertissait automatiquement?? Désolé je suis un peu perdu...

  3. #23
    Membre très actif
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    247
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Janvier 2011
    Messages : 247
    Par défaut
    Citation Envoyé par Obsidian Voir le message
    Il faut apprendre à convertir un nombre vers la base de ton choix.

    Si tu veux afficher un nombre entier en base 10, par exemple, tu procèdes chiffre par chiffre. Tu fais une boucle qui fait passer chaque chiffre « de l'autre côté de la virgule » en divisant le nombre par 10, et en examinant à chaque fois le reste de cette division. Tu obtiens tous les chiffres de la représentation du nombre en base dix, mais dans le sens inverse. À toi de les remettre dans l'ordre (en utilisant une pile, par exemple).

    (...)

    Donc, quand tu as un nombre à virgule flottante quelconque à traiter, tu commences par sa partie entière, et tu poursuis par sa partie rationnelle.
    Tu peux donner un peu plus de détails ou un exemple stp? Je n'ai pas besoin de code, juste de la logique.
    Parce que si comme tu le dis je n'ai pas besoin de travailler directement avec les bits, je n'aurais pas une valeur complètement différente si je récupère directement la mantisse, sans placer la virgule? Je pars du fait de la conversion du binaire en décimal. Avant et après la virgule, on a des règles différentes en convertissant manuellement.

  4. #24
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 452
    Par défaut
    Ce que je veux dire, c'est :

    • Que « i » est une variable codée en binaire dans la mémoire de l'ordinateur, de la même façon que l'est ton float ;
    • Qu'à aucun moment, je ne suis allé manipuler les bits directement ;
    • Que j'ai quand même obtenu le résultat escompté à l'écran, sans utiliser printf (même s'il est écrit à l'envers).


    Donc, étant donné que le problème est purement algébrique, comme dit plus haut, tu n'as aucun besoin d'aller extraire les champs de bit à la main comme tu le fais.

    Le programme que je t'ai donné fait la moitié du travail. D'une manière générale, pour extraire des chiffres un par un, il faut les faire passer « de l'autre côté de la virgule », de manière à pouvoir le distinguer des autres. Si tes chiffres se trouvent à gauche de la virgule, tu divises par 10 (ou plus généralement, par la base de ton choix), pour en faire passer à droite et tu récupères sa valeur grâce au modulo 10.

    Dans le même esprit, lorsqu'il ne tu n'as que des chiffres à droite de la virgule (donc « 0,xxxx » ), tu multiplies par 10 pour en faire passer à gauche, et tu récupère sa valeur en considérant la partie entière.

    Ça signifie également que c'est par divisions ou multiplications successives que tu vas parvenir à tes fins. Donc, le contenu de ton float sera altéré à chaque itération et c'est normal.

  5. #25
    Membre très actif
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    247
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Janvier 2011
    Messages : 247
    Par défaut
    Citation Envoyé par Obsidian Voir le message
    Ce que je veux dire, c'est :

    Le programme que je t'ai donné fait la moitié du travail. D'une manière générale, pour extraire des chiffres un par un, il faut les faire passer « de l'autre côté de la virgule », de manière à pouvoir le distinguer des autres. Si tes chiffres se trouvent à gauche de la virgule, tu divises par 10 (ou plus généralement, par la base de ton choix), pour en faire passer à droite et tu récupères sa valeur grâce au modulo 10.
    Donc j'ai un nombre en binaire interprété par la machine (disons 26539) qui n'a rien à voir avec la valeur de mon float. Qu'est ce que je dois faire passer de l'autre côté de la virgule??? SI j'ai un exposant égal à 3 par exemple, ça signifie que je dois faire 9%10 et ainsi de suite???

  6. #26
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 452
    Par défaut
    Citation Envoyé par dré kam Voir le message
    Donc j'ai un nombre en binaire interprété par la machine (disons 26539) qui n'a rien à voir avec la valeur de mon float. Qu'est ce que je dois faire passer de l'autre côté de la virgule???
    Il faut absolument que tu y réfléchisses un peu par toi-même, parce que c'est le but de l'exercice. Le code qui va derrière, une fois compris le principe, n'a aucun intérêt en lui-même. Je t'ai expliqué deux fois ce qu'il fallait faire passer de l'autre côté de la virgule. Relis bien mes posts.

    Pour te mettre sur la voie, voici un autre exemple. Imaginons que tu travailles sur papier et que tu n'aies pas du tout d'ordinateur (donc, on met de côté le langage C pour le moment). Tu n'as pas non plus de calculatrice. Juste du papier brouillon et un crayon en état de marche.

    Tu me proposes le nombre 26539 en décimal (base 10). Quelle serait sa valeur en base 7 et comment t'y prendrais-tu pour la trouver ?

    SI j'ai un exposant égal à 3 par exemple, ça signifie que je dois faire 9%10 et ainsi de suite???
    On s'en fiche, dans ce cas précis. C'est ta machine qui gère la valeur du nombre. Tu n'as pas besoin de manipuler directement ces exposants pour en faire la représentation en décimal, sauf si tu veux que cet exposant apparaisse à l'écran.

    Il faut bien se souvenir que la base d'un nombre n'est qu'une manière de le représenter et que si tu changes cette base, tu ne changes pas la valeur du nombre lui-même. C'est un peu comme utiliser les chiffres romains : si j'écris « 6 » ou « VI », la valeur numérique reste rigoureusement identique.

  7. #27
    Membre très actif
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    247
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Janvier 2011
    Messages : 247
    Par défaut
    Pour ce cas là je ferais comme d'habitude des divisions successives jusqu'à trouver zéro en examinant les restes. Mais dans mon cas, avec la mantisse, il s'agit d'un nombre réel, pas d'un entier, et sans la virgule en plus. Donc la valeur interprétée par la machine est différente de la valeur en base 10 réelle. C'est ta logique que je ne comprends pas, pas le code.
    -Tu parles de conversion de bases, mais c'est de quelle base vers quelle base vu que la machine interprete le tout???
    -Pourquoi fallait-il que je sache comment sont stockés les float en mémoire alors?
    -Comment je peux savoir si c'est "a gauche" ou "à droite" de la virgule si je connais pas l'exposant? Dans mon code je trouve l'exposant cependant....

  8. #28
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Tu veux afficher un nombre flottant F avec une précision de n chiffres après la virgule. Si ton exercice revient à simuler un printf(), on peut supposer que tu as déjà codé l'affichage d'un entier.
    On peut partir sur le principe (à adapter pour tenir compte du cas des valeurs négatives) :
    1- afficher la partie entière de F 
    2- afficher le point décimal
    3- prendre la partie fractionnaire de F et la multiplier n fois par 10
    4- arrondir en ajoutant 0.5
    5- afficher la partie entière du nombre obtenu
    Exemple : F = 2.875999927520752
    1- sortir 2
    2- sortir .
    3- Partie fractionnaire : 0.875999927520752
       pour n = 3 multiplier par 10^3 -> 875.999927520752
       pour n = 7 multiplier par 10^7 -> 8759999.27520752 
    4- pour n = 3 -> 876.499927520752
       pour n = 7 -> 8759999.77520752
    5- sortir pour n = 3 -> 876
       sortir pour n = 7 -> 8759999
    Affichage
       pour n = 3 -> 2.876
       pour n = 7 -> 2.8759999

  9. #29
    Membre très actif
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    247
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Janvier 2011
    Messages : 247
    Par défaut
    Citation Envoyé par diogene Voir le message
    Tu veux afficher un nombre flottant F avec une précision de n chiffres après la virgule. Si ton exercice revient à simuler un printf(), on peut supposer que tu as déjà codé l'affichage d'un entier.
    On peut partir sur le principe (à adapter pour tenir compte du cas des valeurs négatives) :
    1- afficher la partie entière de F 
    2- afficher le point décimal
    3- prendre la partie fractionnaire de F et la multiplier n fois par 10
    4- arrondir en ajoutant 0.5
    5- afficher la partie entière du nombre obtenu
    Exemple : F = 2.875999927520752
    1- sortir 2
    2- sortir .
    3- Partie fractionnaire : 0.875999927520752
       pour n = 3 multiplier par 10^3 -> 875.999927520752
       pour n = 7 multiplier par 10^7 -> 8759999.27520752 
    4- pour n = 3 -> 876.499927520752
       pour n = 7 -> 8759999.77520752
    5- sortir pour n = 3 -> 876
       sortir pour n = 7 -> 8759999
    Affichage
       pour n = 3 -> 2.876
       pour n = 7 -> 2.8759999
    Merci, merci énormement! C'est beaucoup plus clair ainsi. Je m'y mets ilico!

  10. #30
    Membre très actif
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    247
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Janvier 2011
    Messages : 247
    Par défaut
    Cependant est-ce que ce serait possible, comme le printf original, d'afficher pour n=7 2.876000? C'est juste pour être aussi fidèle que possible.

  11. #31
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 452
    Par défaut
    Bien sûr. Ce sont des zéros non significatifs. Le plus « dur » est de les masquer. Une fois que tu as réussi à obtenir les trois premiers chiffres, rien ne t'empêche de combler le reste avec des zéros.

  12. #32
    Membre très actif
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    247
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Janvier 2011
    Messages : 247
    Par défaut
    Oui mais je veux que ça marche aussi s'il y a 4 chiffres significatifs.
    Par exemple pour 2.876, j'affiche 2,8760000 et pour 2.8765 2.8765000. Donc en gros, est-ce que c'est possible de trouver le nombre de chiffrs significatifs?
    Je pensais pouvoir le faire en trouvant l'exposant mais ça complique tout et n'arrange pas grand chose.

  13. #33
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 452
    Par défaut
    Citation Envoyé par dré kam Voir le message
    Oui mais je veux que ça marche aussi s'il y a 4 chiffres significatifs.
    Par exemple pour 2.876, j'affiche 2,8760000 et pour 2.8765 2.8765000. Donc en gros, est-ce que c'est possible de trouver le nombre de chiffrs significatifs?
    Par de manière absolue pour les raisons que l'on a exposé au départ. Le nombre « 2.876 » ne pouvant être représenté de manière finie en binaire, la valeur approchée la plus proche qui va se trouver dans un double par exemple correspondra à « 2.875999999999999801048033987171947956085205078125 ». Donc rien ne te permet de savoir a priori s'il s'agit en fait de « 2.876 » ou si c'est ce nombre exact que tu as voulu coder.

    Le seul moyen de s'en sortir est de fixer une précision arbitraire. Donc, par exemple, six chiffres après la virgule dans le cas qui nous intéresse.

    Dans ce cas, tu vas obtenir « 2,785999 ». À ce stade, tu fais comme indiqué dans mes commentaires précédents : tu examines la décimale suivante et tu arrondis si nécessaire. Dans le cas présent, cette décimale suivante est encore un « 9 ».

    Comme tu as multiplié par 10⁶ pour sortir tous les chiffres d'un coup, tu obtiens 2785999,9. Tu arrondis donc à 2786000 et tu ignores (ou pas) les zéros à l'affichage. Si tu avais obtenu « 2785999,1 » tu aurais arrondi par défaut et tu aurais gardé les « 9 ».

  14. #34
    Membre très actif
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    247
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Janvier 2011
    Messages : 247
    Par défaut
    Merci pour tout!

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. retourner la partie décimale d'un float
    Par sheridan08 dans le forum Général Python
    Réponses: 16
    Dernier message: 09/01/2022, 22h00
  2. Extraire la partie décimale d'un float
    Par kryptong dans le forum Débuter
    Réponses: 15
    Dernier message: 19/01/2013, 22h01
  3. Extraire la partie décimal d'un float en c
    Par souhe_nits dans le forum Débuter
    Réponses: 5
    Dernier message: 22/03/2011, 17h15
  4. Parties entière et décimale d'un float
    Par amateurc dans le forum Ada
    Réponses: 15
    Dernier message: 31/07/2008, 20h42
  5. Réponses: 15
    Dernier message: 30/01/2008, 18h23

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