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 :

erreur de calcul


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de gijy
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    136
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2005
    Messages : 136
    Par défaut erreur de calcul
    voilà un exemple très curieux sur lequel j'aimerai bien une explication.
    cet exemple est ecrit en VC++ pour windows.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    float a,b,
    CPoint pt_intersection;
     
    pt_intersection.y = pt_intersection.x * (LONG)a;
    pt_intersection.y = pt_intersection.y + (LONG)b;
    pendant le debugage a=0.121199019 et b=6487.88232
    sur le 1er calcul pt_intersection.y = 0 !!!!!
    le cast en LONG a été rajouter pour supprimer les warnings à la compilation car CPoint utilise les membres x et y en LONG.

    d'où vient ce mystere???

  2. #2
    Membre confirmé Avatar de gijy
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    136
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2005
    Messages : 136
    Par défaut
    évidement j'ai oublié de dire qie pt_intersection avait une valeur non null définie avant.

    bon est bien le probleme provenait du cast explicit (LONG) si je laisse le warning sans caster ça fonctionne !

  3. #3
    Membre Expert Avatar de Astraya
    Homme Profil pro
    Consommateur de café
    Inscrit en
    Mai 2007
    Messages
    1 048
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Consommateur de café
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2007
    Messages : 1 048
    Par défaut
    C'est normal. Tu cast un flottant (float) en entier (LONG). Dans les fait, tes valeurs a et b sont donc tronquées avant les calculs, tu perds toutes les décimales. Tu devrais plutôt caster en float les membres x et y de CPoint, dans ce cas tu feras un calcul en virgule flottante, puis le résultat final sera tronqué, puisque tu passeras alors de float à LONG.

  4. #4
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 967
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 967
    Par défaut
    Bonjour,
    Citation Envoyé par Astraya Voir le message
    C'est normal. Tu cast un flottant (float) en entier (LONG). Dans les fait, tes valeurs a et b sont donc tronquées avant les calculs, tu perds toutes les décimales. Tu devrais plutôt caster en float les membres x et y de CPoint, dans ce cas tu feras un calcul en virgule flottante, puis le résultat final sera tronqué, puisque tu passeras alors de float à LONG.
    Et il vaut même mieux utiliser des doubles à la place des floats, qui sont plus limités en chiffres significatifs.

  5. #5
    Expert confirmé
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 766
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 766
    Par défaut
    Citation Envoyé par droggo Voir le message
    Et il vaut même mieux utiliser des doubles à la place des floats
    Sauf que le problème est ailleurs les calculs flottants sont fait avec des points qui ont des coordonnées entières.

    1 possible solution, c'est de stocker des centaines ou des milliers.
    Par exemple, float a=0.121199019 devient int a=12 ou int a=121 (<- le même type que les membres de CPoint)

    Mais cela peut poser problème parce que pour faire des affichages, il faut tout diviser par 100 ou 1000 et donc avoir la "main dessus".

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

Discussions similaires

  1. [2.0] Erreur de calcul numérique de .net o_O
    Par Smeuuh dans le forum Framework .NET
    Réponses: 8
    Dernier message: 11/11/2006, 17h04
  2. [Tableaux] erreur de calcul
    Par dleu dans le forum Langage
    Réponses: 18
    Dernier message: 08/12/2005, 13h28
  3. erreur sur calcul
    Par Sendo dans le forum Access
    Réponses: 2
    Dernier message: 29/09/2005, 09h46
  4. Rotation erreur de calcul
    Par Speed41 dans le forum Algorithmes et structures de données
    Réponses: 10
    Dernier message: 09/03/2005, 16h55
  5. C++Builder fait une erreur de calcul
    Par gandf dans le forum C++Builder
    Réponses: 7
    Dernier message: 03/01/2004, 22h27

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