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

  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?

  7. #7
    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 ccensam Voir le message
    Bonjour,

    J'aimerai savoir est-ce cette marco est standard dans le langage? est-ce sa déclaration est dans <math.h>? Utilisations?
    Sur le forum C, sauf mention explicite, je ne poste que du code standard (C99).
    Citation Envoyé par C99
    7.12 Mathematics <math.h>
    ...
    6 The number classification macros
    FP_INFINITE
    FP_NAN
    FP_NORMAL
    FP_SUBNORMAL
    FP_ZERO
    represent the mutually exclusive kinds of floating-point values. They expand to integer
    constant expressions with distinct values. Additional implementation-defined floating-
    point classifications, with macro definitions beginning with FP_ and an uppercase letter,
    may also be specified by the implementation.

    ...
    ...
    7.12.3.1 The fpclassify macro
    Synopsis
    1 #include <math.h>
    int fpclassify(real-floating x);
    Description
    2 The fpclassify macro classifies its argument value as NaN, infinite, normal,
    subnormal, zero, or into another implementation-defined category.First, an argument
    represented in a format wider than its semantic type is converted to its semantic type.
    Then classification is based on the type of the argument.
    Returns
    3 The fpclassify macro returns the value of the number classification macro
    appropriate to the value of its argument.
    4 EXAMPLE The fpclassify macro might be implemented in terms of ordinary functions as
    #define fpclassify(x) \
    ((sizeof (x) == sizeof (float)) ?_ _fpclassifyf(x) : \
    (sizeof (x) == sizeof (double)) ? _ _fpclassifyd(x) : \
    __fpclassifyl(x))

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