Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вывод вещественного числа 
:(
    Опции темы
alnight
Дата 19.10.2013, 16:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 19
Регистрация: 29.11.2012

Репутация: нет
Всего: нет



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

printf ("%d", 15.0);

выводит ноль?
Если после запятой другая цифра - тоже самое. Я, конечно, понимаю, что слева целочисленный тип ожидается, а справа вещественный, но разве не должно идти просто отбрасывание дробной части?
PM MAIL   Вверх
vinter
Дата 19.10.2013, 17:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 8
Всего: 56



Цитата(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.

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


--------------------
Мой блог
PM MAIL WWW   Вверх
Silent
Дата 19.10.2013, 17:54 (ссылка)    | (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 252
Регистрация: 3.10.2006

Репутация: 1
Всего: 9



Потому что это 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);

PM MAIL   Вверх
alnight
Дата 19.10.2013, 19:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 19
Регистрация: 29.11.2012

Репутация: нет
Всего: нет



Да, но ведь 11.22 в экспоненциальной форме 1.122Е+1.
Откуда же получается -536870912 (или 0x2000 0000)?
Мантисса-то 0x01.
PM MAIL   Вверх
feodorv
Дата 19.10.2013, 19:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 12
Всего: 45



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

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


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
borisbn
Дата 20.10.2013, 00:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 21
Всего: 135



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

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


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

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

Это сообщение отредактировал(а) borisbn - 20.10.2013, 01:01


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
feodorv
Дата 20.10.2013, 02:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 12
Всего: 45



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

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

Это сообщение отредактировал(а) feodorv - 20.10.2013, 02:34


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
volatile
Дата 20.10.2013, 09:44 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 16
Всего: 85



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

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

PM MAIL   Вверх
alnight
Дата 21.10.2013, 23:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 19
Регистрация: 29.11.2012

Репутация: нет
Всего: нет



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

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

А в двоичной 11.22 это 1011.0011
Но я все равно не понимаю, откуда берется то число, которое программа выводит. Она же его откуда-то берет?
PM MAIL   Вверх
feodorv
Дата 22.10.2013, 01:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 12
Всего: 45



Цитата(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);



--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0749 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.