Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > Вывод вещественного числа


Автор: alnight 19.10.2013, 16:26
Всем привет.
Возник вопрос относительно вывода числа в С. Вопрос из разряда не "как сделать", а "почему работает именно так".
Скажите, почему
Код

printf ("%d", 15.0);

выводит ноль?
Если после запятой другая цифра - тоже самое. Я, конечно, понимаю, что слева целочисленный тип ожидается, а справа вещественный, но разве не должно идти просто отбрасывание дробной части?

Автор: vinter 19.10.2013, 17:36
Цитата(Standard C(7.19.6.1/9))
If a conversion specification is invalid, the behavior is undefined. If any argument is not the correct type for the corresponding conversion specification, the behavior is
undefined.

Так что при неправильном использовании строки формата исполняемая среда умывает руки.

Автор: Silent 19.10.2013, 17:54
Потому что это C++  smile 
Для процедуры printf параметры передаются по стеку, float как float, int как int. Соответственно, если мы кладем float (вспомним про представление дробных чисел с их мантиссами и экспонентами), а говорим print'у забирать как int - то и получаем то что видим. Приведение типов он сам делать не будет. Еще пример:
Код

float f = 11.22;
int d = 0;
memcpy(&d, &f, 4);
printf("%d",d);
//ждете 11.22? Получайте -536870912!


делайте без выстрелов себе в ногу:
Код

printf ("%d", (int)15.0);

Автор: alnight 19.10.2013, 19:15
Да, но ведь 11.22 в экспоненциальной форме 1.122Е+1.
Откуда же получается -536870912 (или 0x2000 0000)?
Мантисса-то 0x01.

Автор: feodorv 19.10.2013, 19:34
Цитата(alnight @  19.10.2013,  20:15 Найти цитируемый пост)
Да, но ведь 11.22 в экспоненциальной форме 1.122Е+1.

В двоичной системе?

Автор: borisbn 20.10.2013, 00:54
Цитата(Silent @  19.10.2013,  17:54 Найти цитируемый пост)
делайте без выстрелов себе в ногу:
Код
printf ("%d", (int)15.0);

ну тогда уж
Код
std::cout << 15.0 << 11.22 << "и т.д.";


Добавлено @ 00:56
 smile 
ждёмс нашего истеричного друга (как-то там o2...и другие буквы-цифры), чтобы он сказал как нам нужно правильно жить )))

Добавлено @ 00:57
Кстати, прошу прощения за оффтоп, но почему ему ещё до сих пор не организовали "баню" (и не на пару дней, а навсегда) ? Он кому-то платит, что-ли ?

Автор: feodorv 20.10.2013, 02:34
Цитата(borisbn @  20.10.2013,  01:54 Найти цитируемый пост)
Он кому-то платит, что-ли ?

Ну зачем так сразу. Он пишет с нового форума, а там ещё подходящий функционал не реализован...

Автор: volatile 20.10.2013, 09:44
Цитата(Silent @  19.10.2013,  17:54 Найти цитируемый пост)
Для процедуры printf параметры передаются по стеку, float как float, int как int.

Небольшой нюанс/уточнение float передается как double  smile 

Автор: alnight 21.10.2013, 23:07
Цитата(feodorv @ 19.10.2013,  19:34)
Цитата(alnight @  19.10.2013,  20:15 Найти цитируемый пост)
Да, но ведь 11.22 в экспоненциальной форме 1.122Е+1.

В двоичной системе?

А в двоичной 11.22 это 1011.0011
Но я все равно не понимаю, откуда берется то число, которое программа выводит. Она же его откуда-то берет?

Автор: feodorv 22.10.2013, 01:58
Цитата(alnight @  22.10.2013,  00:07 Найти цитируемый пост)
Она же его откуда-то берет? 

Как намекнул volatile:
Цитата(volatile @  20.10.2013,  10:44 Найти цитируемый пост)
float передается как double

а для %d считываются только 4 байта из этих восьми от double. Можно считать всё:
Код
printf ("%d\n%d\n", 15.0);

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)