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 :

petit problème de calcul flottant


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de fred_sell
    Inscrit en
    Juin 2009
    Messages
    106
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 106
    Par défaut petit problème de calcul flottant
    bonsoir

    voilà je voudrais savoir pourquoi la condition çi-dessous est fausse, regardez :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    float x=12.5;
     
    x-=12;
     
    if(x==0.5)    // cette condition est fausse ?? 12.5-12 = 0.5 !!! n'est ce pas !!
    {
            ...........   //j'ai deja essayé : la condition est fausse
    }
    pourquoi ? est ce que cela est-il dù à l'incertitude, est ce qu'on devra en prendre compte ?

    merci infiniment d'avance !!!

  2. #2
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 484
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 484
    Par défaut
    Bonjour,

    Ça marche bien chez moi (gcc 4.4.4 64 bits). En plus, 12,5 est un nombre fini en binaire, « 1100,1 », donc il n'y a pas d'imprécision due au format.

    Quel compilateur utilises-tu et sur quelle plateforme ?

  3. #3
    Membre confirmé Avatar de fred_sell
    Inscrit en
    Juin 2009
    Messages
    106
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 106
    Par défaut
    Citation Envoyé par Obsidian Voir le message
    Bonjour,

    Ça marche bien chez moi (gcc 4.4.4 64 bits). En plus, 12,5 est un nombre fini en binaire, « 1100,1 », donc il n'y a pas d'imprécision due au format.

    Quel compilateur utilises-tu et sur quelle plateforme ?

    moi c ----> (gcc, 32 bits) !!

  4. #4
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    27 128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 27 128
    Billets dans le blog
    149
    Par défaut
    Bonjour,

    Un meilleur code ne serait il pas:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    float x=12.5f;
    
    x-=12;
    
    if(x==0.5f) 
    {
    
    }
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  5. #5
    Membre confirmé Avatar de fred_sell
    Inscrit en
    Juin 2009
    Messages
    106
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 106
    Par défaut
    d'ou vient ce f, je l'ai jamais vu !!

    quel est mon problème au juste ??

  6. #6
    Invité
    Invité(e)
    Par défaut
    Et si tu fais :

  7. #7
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Par défaut
    Citation Envoyé par fred_sell Voir le message
    d'ou vient ce f, je l'ai jamais vu !!
    Ce f signifie que le nombre est un float.

    12.5f est un float alors que 12.5 est un double (qui sera converti en float lors de l'affectation).

  8. #8
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    J'avoue que moi non plus, je n'avais jamais vu une écriture du genre
    float x=12.5f;
    Par contre la comparaison (==) de 2 float a généralement peu de chance de marcher. Par principe et par habitude, il faut écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if (fabs(x - 0.5) < 1.e-5)
    {
      ...
    }
    J'ai choisi 1.e-5, mais cela dépend de la précision.
    On pourrait se dire, autant travailler en int ou en long, par exemple en centimes. C'est souvent une bonne méthode.
    S'il s'agit de coordonnées, le programme va probablement faire des opération autres que des additions et des soustractions. Donc il est probable que le même problème se présente aussi, même pour des valeurs entières.
    Le test "==" doit être réservé aux cas où on est sûr que le valeurs sont strictement égales.
    Cordialement.

  9. #9
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Avec ou sans f, le code présenté par le posteur doit donner VRAI comme résultat de la comparaison et Obsidian , plus haut, a bien expliqué pourquoi.

Discussions similaires

  1. [Toutes versions] Petit problème de calcul de temps.
    Par DenisHen dans le forum Macros et VBA Excel
    Réponses: 33
    Dernier message: 13/05/2015, 08h21
  2. Réponses: 11
    Dernier message: 19/09/2010, 14h37
  3. Batch - Petit probléme de calcule
    Par Lorponos dans le forum Windows
    Réponses: 9
    Dernier message: 22/07/2006, 11h48
  4. [jointure] Petit problème sur le type de jointure...
    Par SteelBox dans le forum Langage SQL
    Réponses: 13
    Dernier message: 13/02/2004, 18h55
  5. Calcul flottant
    Par Cold Hand dans le forum x86 32-bits / 64-bits
    Réponses: 4
    Dernier message: 10/02/2004, 17h51

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