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 :

tester un float a zéro


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    613
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 613
    Par défaut tester un float a zéro
    Bonjour,

    Il me semble qu'on ne peut pas tester directement la valeur d'un float avec == à cause de problèmes d'imprecisions.

    Mais est ce que tester si un float est égal à zéro est possible, et portable ?

    if ( mon_float == 0)
    {

    }

    Merci.

  2. #2
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Ça dépend comment ce float peut arriver à zéro. Si tu lui mets zéro directement, ça passera.
    Si c'est le résultat d'un calcul (genre, tu fais un float égal à 1.0 et tu en soustraits (1.0/3.0) trois fois), les imprécisions feront leur grand retour et le float ne sera sans doute pas exactement égal à zéro.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    613
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 613
    Par défaut
    C'est moi qui le met à 0.
    Je veux juste tester si sa valeur à changé entre temps, donc si elle n'est plus zéro.

    Donc a priori ca devrait être ok.

    Merci.

  4. #4
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    le meilleur test est avec fabs (si double) et FLT_EPSILON ou DBL_EPSILON


    Si ton compilo n'a pas le fabsf (qui est optionnel dans la norme, je crois), le mieux est de faire

    if ( (nb >= -FLT_EPSILON) && (nb <= FLT_EPSILON) )

  5. #5
    Membre Expert Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Par défaut
    Citation Envoyé par souviron34 Voir le message
    le meilleur test est avec fabs (si double) et FLT_EPSILON ou DBL_EPSILON


    Si ton compilo n'a pas le fabsf (qui est optionnel dans la norme, je crois), le mieux est de faire

    if ( (nb >= -FLT_EPSILON) && (nb <= FLT_EPSILON) )
    Personnellement j'utilise et trouve plus simple d'emploi la macro fpclassify():
    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
    #include <stdio.h>
    #include <math.h>
     
    int main(void)
    {
       float fvar = 0.0F;
       double dvar = 0.0;
       long double ldvar = 0.0L;
     
       if(fpclassify(fvar) == FP_ZERO)
          puts("fvar is 0");
     
       if(fpclassify(dvar) == FP_ZERO)
          puts("dvar is 0");
     
       if(fpclassify(ldvar) == FP_ZERO)
          puts("ldvar is 0");
     
       return 0;
    }

  6. #6
    Membre éprouvé Avatar de ccensam
    Inscrit en
    Juillet 2005
    Messages
    128
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Juillet 2005
    Messages : 128
    Par défaut
    Bonjour,
    Citation Envoyé par nicolas.sitbon Voir le message
    Personnellement j'utilise et trouve plus simple d'emploi la macro fpclassify():
    J'aimerai savoir est-ce cette marco est standard dans le langage? est-ce sa déclaration est dans <math.h>? Utilisations?

Discussions similaires

  1. tester si la valeur d'un textField est un float.
    Par bellemlih dans le forum Interfaces Graphiques en Java
    Réponses: 7
    Dernier message: 08/02/2008, 11h18
  2. Tester si un nombre est float
    Par namstou3 dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 01/01/2008, 15h13
  3. Tester un FLOAT dans une clause WHERE
    Par manhattan.project dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 02/08/2007, 12h20
  4. Tester nombre : float ou integer?
    Par webrider dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 14/04/2007, 15h02
  5. Tester la valeur(float ou pas) d'un input text
    Par Battosaiii dans le forum Général JavaScript
    Réponses: 23
    Dernier message: 16/04/2006, 10h47

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