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 :

Soustraction de 2 nombres de type double


Sujet :

C++

  1. #1
    Membre régulier
    Inscrit en
    Février 2008
    Messages
    276
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 276
    Points : 83
    Points
    83
    Par défaut Soustraction de 2 nombres de type double
    Salut tout le monde,
    Je suis en train de faire une opération de soustraction simple mais le galère à avoir le bon résultat.
    En fait il s'agit de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    double dMargeRestante = m_dHauteur - dHauteur - dNewMargeTop;

    + m_dHauteur = 0.20000000000000001;
    + dHauteur = 0.040000000000000001
    + dNewMargeTop = 0.16000000000000000

    Je vous signale que toutes les variables sont déclarées de type "double".

    Avec ces valeurs, j'ai dMargeRestante = -9.2559631349317831e+061. Or je dois avoir 0 !
    Est ce que quelqu'un pourrait m'expliquer mon erreur et m'aider à résoudre ce problème.
    Je vous remercie d'avance.
    Bien cordialement

  2. #2
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Salut,

    Le problème des doubles, c'est que certaines valeurs ne sont pas représentables de manière précise, un peu comme c'est le cas de la fraction 1/3 qui vaut... 0.3333333333... (en base 10).

    C'est, par exemple, la raison pour laquelle tu obtiens 0.20000000000000001 et non... 0.2, qui n'est qu'une manière imprécise de représenter en base 10 la valeur binaire imprécise que tu manipule

    Lorsque tu additionne ou que tu soustrait plusieurs valeurs par nature imprécise, il ne faut pas t'étonner d'obtenir une résultat... imprécis.

    Par contre, ce qui m'étonne, c'est que l'exposant du résultat soit positif... ne devrait il pas plutôt être négatif

    Une alternative pourrait (si cela s'avère utile) d'envisager la création d'une structure personnelle qui permettrait, par exemple, de représenter des valeurs en virgule fixe, avec l'ensemble des opérateurs qui vont bien... mais, évidemment, cela peut toujours être se faire du mal pour rien
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  3. #3
    Rédacteur

    Avatar de Davidbrcz
    Homme Profil pro
    Ing Supaéro - Doctorant ONERA
    Inscrit en
    Juin 2006
    Messages
    2 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ing Supaéro - Doctorant ONERA

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Points : 4 732
    Points
    4 732
    Par défaut
    Tu dépasses la représentation maximale possible pour un double (15 chiffres chez moi).
    Pour tester (code honteusement récupéré):

    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
    19
    20
    21
    #include <iostream>
    #include <ostream>
    #include <limits>
     
    int main()
    {
    typedef std::numeric_limits< double > dl;
    typedef std::numeric_limits< float > fl;
     
    using namespace std;
     
    cout << "double:\n";
    cout << "\tdigits (bits):\t\t" << dl::digits << endl;
    cout << "\tdigits (decimal):\t" << dl::digits10 << endl;
     
    cout << endl;
     
    cout << "float:\n";
    cout << "\tdigits (bits):\t\t" << fl::digits << endl;
    cout << "\tdigits (decimal):\t" << fl::digits10 << endl;
    }
    Donc il y a troncature et underflow.

    Solution indiquée par Koala.

    PS/ y'avait pas une entré dans la FAQ sur ca ?
    "Never use brute force in fighting an exponential." (Andrei Alexandrescu)

    Mes articles dont Conseils divers sur le C++
    Une très bonne doc sur le C++ (en) Why linux is better (fr)

  4. #4
    Membre régulier
    Inscrit en
    Février 2008
    Messages
    276
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 276
    Points : 83
    Points
    83
    Par défaut
    Merci pour ta réponse rapide. En fait, mes recherche m'ont confirmé ce que tu as expliqué.
    Par contre je n'ai pas bien saisie ta proposition de solution.

  5. #5
    Membre chevronné
    Avatar de Joel F
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Septembre 2002
    Messages
    918
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2002
    Messages : 918
    Points : 1 921
    Points
    1 921
    Par défaut
    décidement je vais le mettre en signature :E

    http://docs.sun.com/source/806-3568/ncg_goldberg.html

    On apprends plus ça en école ?

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

Discussions similaires

  1. [MySQL] soustraction de deux nombre de type double
    Par magda62 dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 17/06/2009, 15h00
  2. [VB.Net] Convertir un nombre au format double en date
    Par Immobilis dans le forum ASP.NET
    Réponses: 6
    Dernier message: 14/11/2005, 15h34
  3. arrondi avec type double
    Par la drogue c'est mal dans le forum MFC
    Réponses: 6
    Dernier message: 08/04/2005, 17h51
  4. soustraction de 2 nombres
    Par coucoucmoi dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 10/03/2004, 14h55
  5. [LG]Convertir le type double en string
    Par @tom@ dans le forum Langage
    Réponses: 8
    Dernier message: 18/01/2004, 19h20

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