Целочисленное в плавающее преобразование в C - PullRequest
3 голосов
/ 30 января 2011
float f1 = 123.125;
int i1 = -150;

f1 = i1;    // integer to floating conversion
printf("%i assigned to an float produces %f\n", i1, f1);

Вывод:

-150 assigned to an float produces -150.000000

Мой вопрос: почему результат имеет 6 нулей (000000) после ., а не 7 или 8 или какое-то число?

Ответы [ 4 ]

7 голосов
/ 30 января 2011

Это именно то, что делает printf.Смотрите справочную страницу , где написано

f, F

Двойной аргумент должен быть преобразован в десятичную запись в стиле«[-] ddd.ddd», где количество цифр после радикального символа равно спецификации точности. Если точность отсутствует, она должна быть принята за 6 ;если точность явно равна нулю и флаг '#' отсутствует, символ радиуса не должен появляться.Если появляется символ радиуса, перед ним должна быть хотя бы одна цифра.Младшая цифра должна быть округлена способом, определяемым реализацией.

(выделено мной)

Это не имеет ничего общего с тем, как 150 представляется как плавающееномер точки в памяти (и на самом деле он повышен до double, потому что printf - это varargs).

3 голосов
/ 30 января 2011

Поскольку стандарт C (§7.19.6.1) гласит, что при отсутствии информации об обратном, %f напечатает 6 десятичных знаков.

f,F Двойной аргумент, представляющийЧисло с плавающей точкой преобразуется в десятичную запись в стиле [-] ddd.ddd , где число цифр после символа десятичной точки равно спецификации точности.Если точность отсутствует, она принимается за 6;если точность равна нулю и флаг # не указан, символ десятичной точки не отображается.

3 голосов
/ 30 января 2011

Количество нулей, которое вы видите, является результатом точности по умолчанию, используемой преобразованием %f printf. Это в основном не связано с целым числом в преобразование с плавающей запятой.

2 голосов
/ 30 января 2011

Арифметика с плавающей точкой не является точной.printf просто показывает это число нулей .

Из документации:

Количество цифр по умолчанию после десятичной точки равно шести, номожно изменить с помощью поля точности.Если появляется десятичная точка, перед ней должна быть хотя бы одна цифра.Значение «double» округляется до правильного количества десятичных знаков.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...