Je compilé le programme suivant avec gcc 4.4.1 et j'obtenir une sortie inattendue (bien, inattendu pour moi)Bloc If-else et résultats inattendus avec le type de données float. [Edité avec une question]
#include<stdio.h>
int main()
{
float x=0.3, y=0.7;
if(x==0.3)
{
if(y==0.7)
printf("Y\n\n");
else
printf("X\n\n");
}
else
printf("NONE\n\n");
}
Output: NONE
#include<stdio.h>
int main()
{
float x=0.3, y=0.7;
if(x<0.3)
{
if(y==0.7)
printf("Y\n\n");
else
printf("X\n\n");
}
else
printf("NONE\n\n");
}
Output: NONE
#include<stdio.h>
int main()
{
float x=0.3, y=0.7;
if(x>0.3)
{
if(y>0.7)
printf("Y\n\n");
else
printf("X\n\n");
}
else
printf("NONE\n\n");
}
Output:X
Donc, il est clairement visible que la valeur stockée dans "x" est supérieure à 0,3 et la valeur stockée dans "y" est inférieure à 0,7
Pourquoi cela se passe-t-il? Est-ce une propriété du type de données float ou les instructions if-else interprètent float d'une manière différente?
Merci.
Editer: D'accord, j'ai réfléchi et je commence à avoir un peu de confusion maintenant. Veuillez dire si ma compréhension de ce problème est correcte ou non.
float x=0.3;
Ceci stocke x=0.30000001192092895508
dans la mémoire. De toute évidence, cela est supérieur à 0.3
(Est-ce correct?)
Maintenant, double x=0.3
résultats dans x=0.29999999999999998890
ce qui est inférieur à 0,3
question principale (Est-ce exact aussi?): Donc, si j'utilise magasin 0.3
dans float x
, l'instruction suivante if(x>0.3)
donne x=0.30000001192092895508
étant implicitement castée en tant que double et 0.3 est également un double au lieu d'un flottant. Par conséquent 0.3=0.29999999999999998890
et l'opération interne est if((double) 0.30000001192092895508 > (double) 0.29999999999999998890)
. Est-ce correct?
Veuillez ajouter "f" aux valeurs du flotteur et afficher les résultats. Si Java le sait, les nombres flottants non définis explicitement avec "f" comme flottant obtiendront un double. Probablement des choses étranges se produisent lors de la coulée entre le flotteur et le double. Il se pourrait que 0.3 devienne 0.30000000000000001 en raison d'une erreur d'arrondi. –
Mieux encore, changez toutes vos variables en «double». Toutes les fonctions mathématiques de C renvoient 'double ', donc vous pourriez aussi bien être cohérent. 'float' est seulement utile pour sauver la mémoire quand vous avez un tableau de millions d'entre eux. – dan04