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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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 147
    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 147
    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 256
    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 256
    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
    Expert confirmé
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 599
    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 599
    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);

+ 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: 03/09/2017, 23h58
  2. Réponses: 9
    Dernier message: 15/01/2010, 16h43
  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, 22h50
  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, 12h57
  5. [LG]Programme qui n'affiche rien
    Par ousunas dans le forum Langage
    Réponses: 4
    Dernier message: 17/02/2004, 19h38

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