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 :

Bug MPFR 0.0001 qui s'affiche en 0.000099999


Sujet :

C

  1. #1
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2019
    Messages
    108
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2019
    Messages : 108
    Par défaut Bug MPFR 0.0001 qui s'affiche en 0.000099999
    Bonjour,

    On est entrain de codé une calculatrice et on utilise la mpfr pour stocker et manipuler les nombres.
    La Mpfr permet de choisir le nombre de bits sur lequel est stocké le flottant.

    On a un problème lorsque l'utilisateur entre un nombre de type 0.0001 ou fait un calcul dont le résultat est 0.0001 la calculatrice affiche 0.000099999999999999... quelqu'un a t'il une solution? Est-ce un problème courent?

  2. #2
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2019
    Messages
    108
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2019
    Messages : 108
    Par défaut
    On est sur une piste.
    Apparemment il n'y a aucun problème dans la représentation en mémoire du nombre, les problèmes surviennent lorsqu'on veut convertir le nombre en décimal sous forme de chaîne de caractère.

  3. #3
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 162
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 162
    Billets dans le blog
    4
    Par défaut
    C'est pas un bug c'est les limites de la représentation binaire pour les nombres flottants qui ne sont pas tous possibles.
    Il doit y avoir une centaine de sujets sur ce forum qui rapportent ce "bug".
    Et pour afficher un flottant correctement il faut indiquer sa précision dans le format d'affichage (d'habitude printf).
    https://en.wikipedia.org/wiki/Single...g-point_format
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  4. #4
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2019
    Messages
    108
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2019
    Messages : 108
    Par défaut
    Merci

  5. #5
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2019
    Messages
    108
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2019
    Messages : 108
    Par défaut
    Quelqu'un aurait une solution à ce problème?

  6. #6
    Responsable Systèmes


    Homme Profil pro
    Gestion de parcs informatique
    Inscrit en
    Août 2011
    Messages
    18 412
    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 : 18 412
    Par défaut
    Pour faire une calculatrice, j'utiliserais pas les nombres en virgule flottante, c'est imprécis. Peut-être avec la bibliothèque GMP.
    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

  7. #7
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2019
    Messages
    108
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2019
    Messages : 108
    Par défaut
    C'est pas une calculatrice simple, ça doit-être une calculatrice complète. C'est un projet scolaire.

  8. #8
    Expert confirmé
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 600
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    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 600
    Par défaut
    Citation Envoyé par baragouine Voir le message
    Quelqu'un aurait une solution à ce problème?
    Comme on te l'a dit, il n'y a pas de solution, du moins de solution simple.
    Quand tu écris 0.0001 le nombre doit être stocké en base 2. Et en base 2, ce nombre nécessite une infinité de décimale, il doit se limiter à 52 bits de précision et doit prendre le plus proche hésitant entre 0.000099999999999999977687119290248318748126621358096599578857421875 et 0.000100000000000000004792173602385929598312941379845142364501953125.
    Pour savoir celui qui est choisi, essaie:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    printf("%.66f\n",0.0001);
    Pour gérer cela, tu peux utiliser une bibliothèque qui travaille en base 10 plutôt qu'en base 2. Par exemple, en base 10 : on comprend que (1/3)*3-1 ne fasse pas 0 (la plupart des calculatrices se tromperons car elles sont en base 10), mais en base 2 le même calcul retourne bien 0.
    L'autre possibilité est de limiter l'affichage à quelques chiffres, et l'imperfection sera masquée:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    printf("%.20f\n",0.0001);

  9. #9
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2019
    Messages
    108
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2019
    Messages : 108
    Par défaut
    Merci

  10. #10
    Membre émérite
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Juillet 2020
    Messages
    352
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Juillet 2020
    Messages : 352
    Par défaut
    [hs]

    Citation Envoyé par dalfab Voir le message
    [...]
    Par exemple, en base 10 : on comprend que (1/3)*3-1 ne fasse pas 0 (la plupart des calculatrices se tromperons car elles sont en base 10),
    [troll mais pas]
    et pourtant 0,9999(9....) = 1
    [/troll mais pas]

    Citation Envoyé par dalfab Voir le message
    mais en base 2 le même calcul retourne bien 0.
    Il y a un souci similaire car 1/3 en base 2 se note : 0,010101(01...) qui multiplié par 3 donne noté en base 2 0,11111111(1...) mais de la même manière on a de toute façon 0,11111(1...)=1 noté en base 2.

    Il n 'y a que dans les bases 3ⁿ où 1/3 aura une notation finie.

  11. #11
    Membre Expert

    Homme Profil pro
    Directeur de projet
    Inscrit en
    Mai 2013
    Messages
    1 708
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2013
    Messages : 1 708
    Par défaut Base de niveau élevé ?
    Bonjour WhiteCrow
    Citation Envoyé par WhiteCrow Voir le message
    Il n 'y a que dans les bases 3ⁿ où 1/3 aura une notation finie.
    Enfin, toutes les bases de forme k*3 (avec k > 0 bien sûr). Par exemple 1/3 en base 6 = 0.2.

    Salut

  12. #12
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2019
    Messages
    108
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2019
    Messages : 108
    Par défaut
    Si je comprend bien la seule solution est d'utiliser une bibliothèque en base 10? Il n'y a pas de solution avec une bibliothèque qui fonctionne en base 2.

  13. #13
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 162
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 162
    Billets dans le blog
    4
    Par défaut
    Non vu que c'est mathématiquement impossible en base 2.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

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

Discussions similaires

  1. Bug bizarre fenêtre qui s'affiche avec une hauteur rétrécie
    Par electroremy dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 04/09/2017, 00h58
  2. Réponses: 9
    Dernier message: 15/01/2010, 17h43
  3. explorer.exe qui bug, fenêtre, menu et boutons non affichés
    Par oceanbigone dans le forum Windows XP
    Réponses: 12
    Dernier message: 09/12/2008, 23h50
  4. [GDI] dessin qui s'affiche en couleur puis en noir et blanc
    Par Harry_polin dans le forum Windows
    Réponses: 4
    Dernier message: 25/06/2004, 13h57
  5. [LG]Programme qui n'affiche rien
    Par ousunas dans le forum Langage
    Réponses: 4
    Dernier message: 17/02/2004, 20h38

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