Я скомпилировал следующую программу с gcc 4.4.1, и я получил неожиданный вывод (ну, неожиданно для меня)
#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
Итак, это ясновидно, что сохраненное значение в «x» больше 0,3, а сохраненное значение в «y» меньше 0,7
Почему это происходит?Это свойство типа данных float или операторы if-else интерпретируют float по-другому?
Спасибо.
Редактировать: Хорошо, я обдумал это, и я получаюнемного смущен сейчас.Пожалуйста, скажите, правильно ли я понимаю эту проблему.
float x=0.3;
Это хранит x=0.30000001192092895508
в памяти.Очевидно, что это больше, чем 0.3
(это правильно?)
Теперь, double x=0.3
приводит к x=0.29999999999999998890
, и это меньше, чем 0,3 (Это тоже правильно?)
Основной вопрос: так что если я использую store 0.3
в float x
, то следующее утверждение if(x>0.3)
приводит к тому, что x=0.30000001192092895508
неявно приводится к типу double, а 0.3 также является double вместо float.Следовательно, 0.3=0.29999999999999998890
и внутренняя операция if((double) 0.30000001192092895508 > (double) 0.29999999999999998890)
.Это правильно?