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 :

Probleme de précision


Sujet :

C++

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 15
    Points : 13
    Points
    13
    Par défaut Probleme de précision
    Bonjour,
    Je developpe sur visual C++ 2003 et j'ai un probleme de précision de calcul.
    Voici un bout de code :
    double VarDbl1,VarDbl2;
    double VarDblRes;

    VarDbl1 = 5.2;
    VarDbl2 = 4;

    VarDblRes = VarDbl1 + VarDbl2 ;


    Le resultat n'est pas 9.2 comme on pourrait si attendre mais 9.1999999999999993 !!!
    Je vous laisse imaginer ce que cela peut donner dans une equation complexe.
    Je ne vois pas comment resoudre ce pb.
    Y a t il une option dans le compilateur ?

    Merci d'avance pour votre aide

  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 : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Ces imprécisions sont inhérentes à l'encodage des nombres flottants. Si tu veux plus de précision il faudra te tourner vers, au choix :

    - Le type long double qui peut faire 8 octets sur certaines architectures
    - Des classes spéciales gérant des flottants avec plus de précision
    - Des classes de nombres en virgule fixe
    - Le calcul formel

  3. #3
    Membre éclairé
    Inscrit en
    Janvier 2005
    Messages
    711
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 711
    Points : 751
    Points
    751
    Par défaut
    tu as aussi l'option d'utiliser des intervalles pour representer les floats.. comme ca tu garantit le resultat dans un intervalle.

    mais je te signale quand meme que l'erreur sur le resultat de ton calcul est inferieur a 10^-15, meme si ca fait drole c'est quand meme minuscule. apres, dans ce cas precis je t'accorde que c'est quand meme etrange...

  4. #4
    Membre actif
    Inscrit en
    Décembre 2003
    Messages
    272
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 272
    Points : 284
    Points
    284
    Par défaut
    Citation Envoyé par jobherzt
    Apres, dans ce cas precis je t'accorde que c'est quand meme etrange...
    Pas tant que ça si tu remarques que 0.2 ne tombe pas juste (en binaire).

  5. #5
    Membre éclairé
    Inscrit en
    Janvier 2005
    Messages
    711
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 711
    Points : 751
    Points
    751
    Par défaut
    bien vu

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 15
    Points : 13
    Points
    13
    Par défaut
    Merci pour vos réponses.

    En fait mon probleme vient du fait que j'ai besoin d'arrondir cette valeur au 0.5 le plus proche.
    j'utilise cette petite methode

    double AR;

    AR = 10*Val- (WORD)(10*Val);
    if (AR >= 0.5)
    Val = (float)((((float)(WORD)(10*Val)) + 0.5)/10);
    else
    Val = (float)(((float)(WORD)(10*Val))/10);

    return Val;


    A cause de cet imprecision l'arrondi ne se fait pas toujours du bon coté.

    Pour minimiser ce pb j'ajoute à ma valeur un epsilon (0.0001) et cela me donne des résultats plus correcte.

  7. #7
    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 : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Et avec ce code ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    return static_cast<int>(Val * 2 + 0.5) * 0.5;

  8. #8
    Membre chevronné
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Points : 2 107
    Points
    2 107
    Par défaut
    Laurent vient de te montrer:
    1) que ton code de 7 lignes tient en une seule!
    2) la bonne façon de coder en C++ (static_cast, etc...)
    3) qui sait, la solution à ton problème...

    En tous cas, c'est un code vraiment mieux

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 15
    Points : 13
    Points
    13
    Par défaut
    Ok merci pour la leçon de prog
    je ne connaissais pas cette syntaxe
    et en plus cela a fait disparaitre les problemes de precision
    Mon pb est résolu !

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

Discussions similaires

  1. Gtk::DrawingArea et Gdk::Pixbuf, probleme de précision.
    Par Forseti dans le forum GTK+ avec C & C++
    Réponses: 3
    Dernier message: 06/03/2012, 14h19
  2. Probleme de précision
    Par Gualino dans le forum VB.NET
    Réponses: 13
    Dernier message: 16/10/2011, 01h05
  3. Réponses: 21
    Dernier message: 01/09/2011, 10h56
  4. [java2D] Probleme de précision de tracé
    Par olivier__ dans le forum 2D
    Réponses: 9
    Dernier message: 27/07/2005, 18h09
  5. [Kylix] Probleme d'execution de programmes...
    Par yopziggy dans le forum EDI
    Réponses: 19
    Dernier message: 03/05/2002, 15h50

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