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 :

[float] Calcul et résultat différent


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Inactif  
    Avatar de Kerod
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    11 672
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 11 672
    Par défaut [float] Calcul et résultat différent
    Salut,

    Je tente d'effectuer un simple calcul depuis quelques temps et malgré sa simplicité je n'obtiens pas le bon résultat.

    Voici la chose : j'effectue un calcul avec 1 - 1 tous deux des float qui doivent me retourner un float (0). Et non j'obtiens
    -1.49012e-08 = 1 - 1
    Plutôt étrange

    Auriez-vous une idée sur le problème ?

  2. #2
    Membre chevronné
    Avatar de ZouBi
    Inscrit en
    Octobre 2007
    Messages
    508
    Détails du profil
    Informations professionnelles :
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Octobre 2007
    Messages : 508
    Par défaut
    c'est ça la magie des float
    Bon, sans vouloir dire de connerie, il me semble qu'il est deconseillé de faire des calculs avec des flotants, car les resultats ne sont rarement exactes ( meme pour des calculs simples comme le tiens )

  3. #3
    Membre confirmé Avatar de babar63
    Homme Profil pro
    Développeur jeux vidéos/3d Temps réel
    Inscrit en
    Septembre 2005
    Messages
    241
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Développeur jeux vidéos/3d Temps réel

    Informations forums :
    Inscription : Septembre 2005
    Messages : 241
    Par défaut
    Comment on arrive à ce résultat je ne sais pas mais sachant que -1.49012e-08 = -0.00000000149012, cela doit surement correspondre à une marge d'erreur introduit par le calcul en flottant. En tout cas en effectuant cette opération : j'obtiens bien 0

  4. #4
    Inactif  
    Avatar de Kerod
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    11 672
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 11 672
    Par défaut
    Mon calcul ne se limite pas à 1.f mais à des variables que je récupère depuis un vecteur.

    Sinon je suis bien obligé d'utiliser des réels sinon mes calculs ne seront pas corrects.

    [Edit]
    De plus j'ai essayé la solution du 1.f mais rien à faire toujours le même résultat

  5. #5
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    Lire : http://cpp.developpez.com/faq/cpp/?p...ions_flottants

    Ou pour un truc un peu (euphémisme) plus mathématique : http://docs.sun.com/source/806-3568/ncg_goldberg.html

    Si ces infos ne suffisent pas, il faudra nous en dire plus sur le contexte de ces calculs pour qu'on puisse tenter de mieux t'aider...

    Remarque : C'est un problème avec tous les langages informatiques qui soient...
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  6. #6
    Inactif  
    Avatar de Kerod
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    11 672
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 11 672
    Par défaut
    A vrai dire voilà une partie de mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    for(int j = 0; j < (2 * nbVar) + 1; j++)
            {
                float temp = valeur * tmp[0][j];
                matrice[i][j] = tmp[i][j] - temp;
            }
    Avec tmp une matrice contenant tout mes float. valeur étant un float également. i un indice fixé par une précédente boucle for

    Au final je dois remplir une autre matrice avec le résultat de ce calcul. Les imprécisions sont assez gênantes et j'ai pas trop de tests à faire dessus (en référence à ton premier lien).

    C'est la première fois que je vois un tel problème et pourtant les langages j'en ai utilisé pas mal

    faire ceci ne va pas me renvoyer un entier ? En tout cas c'est ce qui me semble et c'est pas ce que je veux

  7. #7
    Membre confirmé Avatar de babar63
    Homme Profil pro
    Développeur jeux vidéos/3d Temps réel
    Inscrit en
    Septembre 2005
    Messages
    241
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Développeur jeux vidéos/3d Temps réel

    Informations forums :
    Inscription : Septembre 2005
    Messages : 241
    Par défaut
    Pour ce qui est des autres langages je n'ai aucune idée mais par contre les matrices en float je n'utilise que ça à longueur de journée , je n'ai jamais eu réellement de problèmes avec les imprécisions, il me semble avoir vu seulement un cas d'analyse/traitement d'image qui posait problème avec ces imprécisions (boucle imbriquée à n'en plus finir avec des calculs monstrueux... ). Je ne pense pas avoir suffisamment d'expérience pour en dire plus mais ces imprécisions pose vraiment problèmes? Travailler avec des doubles ne réglerait pas le problème?

    Citation Envoyé par Kerod
    faire ceci ne va pas me renvoyer un entier ? En tout cas c'est ce qui me semble et c'est pas ce que je veux
    abs retourne bien un entier, il faut utiliser la fonction fabs

  8. #8
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    Citation Envoyé par Kerod Voir le message
    A vrai dire voilà une partie de mon code :
    Plus que du code, c'est de contexte d'utilisation dont j'ai besoin. A quoi sert ce code ?
    Si c'est pour faire de la simulation numérique de modèle physique, en quoi une imprécision de 10e-8 est-elle gênante (et si c'est le cas, pourquoi ne pas calculer en double ? Quand je vois float dans un programme, je me méfie) ?
    Si c'est pour faire de la comptabilité, il ne faut pas utiliser les virgules flottantes, car ce domaine a ses propres règles d'arrondi (par pays ?) qu'on est tenu de préciser.
    Si c'est pour faire des maths niveau collège, peut-être se faire une classe de nombre en base 10 est-elle la solution.
    Si c'est pour faire des maths niveau recherche, peut-être une classe à précision infinie (ou du moins réglable) est-elle la solution.
    Si c'est un problème d'affichage moche à l'écran, peut-être baisser la précision de l'affichage est la solution.
    Si c'est pour faire...

    Citation Envoyé par Kerod Voir le message
    C'est la première fois que je vois un tel problème et pourtant les langages j'en ai utilisé pas mal
    Mais as-tu fait du calcul numérique avec ces langages ? Certains proposent des classes pour gérer des nombres à plus forte précision, au prix d'un temps de calcul qui s'écroule, mais ce n'est pas le mode classique.

    Citation Envoyé par Kerod Voir le message
    faire ceci ne va pas me renvoyer un entier ? En tout cas c'est ce qui me semble et c'est pas ce que je veux
    La différence de floats est un float. La valeur absolue d'un float est un float, donc non.

    Si tu veux convertir en entier, par défaut, c'est un cast qu'il te faut :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int i = static_cast<int>(f3-1.0);
    Mais encore une fois, sans comprendre la problématique, difficile d'en dire plus...
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

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

Discussions similaires

  1. Réponses: 13
    Dernier message: 01/06/2011, 15h58
  2. [W3C] Résultats différents avec IE ou FF
    Par Linoa dans le forum Balisage (X)HTML et validation W3C
    Réponses: 3
    Dernier message: 17/11/2005, 13h45
  3. Résultats différent entre une requête SQL, et la même en VBA
    Par thetaps dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 23/09/2005, 12h05
  4. Encode - Decode : probleme, résultats différent.
    Par barok dans le forum Administration
    Réponses: 1
    Dernier message: 26/08/2005, 10h43
  5. Réponses: 15
    Dernier message: 21/01/2005, 03h25

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