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.
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.
Ç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.
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.
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; }
Partager