OriginalGriff
Это сложно, но в данном случае речь идет о том, что такое числа на самом деле.
Когда вы вводите "1.1" в качестве числа, что это за число? Мы знаем, что это не целое число - потому что оно имеет дробную составляющую - так что это число с плавающей запятой какой-то формы, но что это за "размер" числа с плавающей запятой? Разве это имеет значение?
В языке Си существует два способа хранения чисел с плавающей запятой: float
и double
(ну ... технически их три: long double
также доступно), и разница заключается в том, что они не занимают много места. float
значения обычно занимают 4 байта, а double
возьмите 8, потому что они могут содержать более точные значения.
Но что такое 1.1 с точки зрения компилятора? Ответ: это а double
потому что это "самый точный", и он получает неявное приведение к float
когда вы выполняете задание.
Разве это имеет значение? Да. Поскольку числа с плавающей запятой не хранятся как "один один и точка один также", они хранятся гораздо более сложным способом: Формат с плавающей запятой одинарной точности- Википедия[^] вдается в детали, но поскольку все это бионарное, а не десятичное основание, 1.1 не хранится как "точное" число - это другое. И double
версия не такая же, как у float
версия, потому что она может хранить больше двоичных цифр.
Простое решение-придерживаться одного формата:
int main()
{
float x = 1.1;
while(x == 1.1F)
{
printf("%f\n",x);
x = x - 0.1F;
}
return 0;
}
Или
int main()
{
double x = 1.1;
while(x == 1.1)
{
printf("%f\n",x);
x = x - 0.1;
}
return 0;
}
И он будет делать то, что вы ожидаете.
OriginalGriff
:вздыхать:
Прочтите то, что я сказал выше, и взгляните на ссылку wiki.
1.1 - это двойник, а не поплавок. 1.1 F-это поплавок, а не двойник.