Подтвердить что ты не робот

Какая разница между printf переменной с плавающей запятой и константой?

Здесь мой код:

float x = 21.195;
printf("%.2f\n", x);
printf("%.2f\n", 21.195);

Я ожидал бы, что оба оператора печати будут иметь идентичный вывод, но вместо этого первые печатают 21.19, а второй печатает 21.20.

Может ли кто-нибудь объяснить, почему вывод отличается?

4b9b3361

Ответ 1

Значения разные. Первый - это float, который обычно составляет 4 байта. Второй - это double, который обычно составляет 8 байтов.

Правила округления основаны на третьей цифре после запятой. Итак, в одном случае значение составляет примерно 21.19499997, а другое 21.1950000000001, или что-то в этом роде. (Они составлены для иллюстрации проблемы с округлением и неточными числовыми форматами.)

Ответ 2

По умолчанию 21.195 является двойным.

Если вы хотите поплавок, напишите:

21.195F

или

(float)21.195

Привет

Ответ 3

Когда переменная с плавающей запятой определена в C, по умолчанию она устанавливается в double. Таким образом, x установлен в float, потому что вы упомянули его явно, иначе 21.195 считается двойным.

Теперь, как упоминалось выше, float обычно составляет около 4 байтов, а double - около 8 байтов. Таким образом, значение float имеет 24 значащих бита с 7 цифрами точности, а double имеет 53 значащих бита с точностью от 15 до 16 цифр.

Функция округления%.2f работает, чтобы округлить число до 2 знаков после запятой и проверяет третью цифру после десятичной точки для округления. Таким образом, 21.195 в float расширяется до 21.19499998 и затем уменьшается до 21.19 после%.2f, а 21.195 в двойном расширении до 21.1950000000000001 и, следовательно, уменьшается до 21.20.

Надеюсь, что это поможет!