Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RusFAQ.ru: Программирование на C / C++


РАССЫЛКИ ПОРТАЛА RUSFAQ.RU

/ КОМПЬЮТЕРЫ И ПО / Языки программирования / C/C++

Выпуск № 713
от 17.04.2007, 19:05

Администратор:Калашников О.А.
В рассылке:Подписчиков: 476, Экспертов: 80
В номере:Вопросов: 2, Ответов: 8


Вопрос № 82162: Возьмем такую достаточно незатейливую программку. Здесь я присваиваю переменной float значение. Меня теперь интересуют значения отдельных байтов ее. Когда я присваиваю переменной f (типа float) значение 1001 (дробная ч. равна нулю), то *a выводится к...
Вопрос № 82264: Please, помогите мне решить задачки!!!!!!!!!!!...

Вопрос № 82.162
Возьмем такую достаточно незатейливую программку. Здесь я присваиваю переменной float значение. Меня теперь интересуют значения отдельных байтов ее. Когда я присваиваю переменной f (типа float) значение 1001 (дробная ч. равна нулю), то *a выводится как 16384. Это, я так понимаю, 4 байта переменной float, интерпретированные уже как unsigned int (мне именно это и нужно).
Но мне непонятно, почему *a равно 0 в случае если я введу 1000 или 10. Тоже самое произойдет, если я введу 3.5. Я вывожу не те байты? Если продолжить эксперименты, то значения указателей ff и a равны, а *ff выводит правильное значение. Чем тогда объяснить эти нули? Действительно ли *a указывает куда нужно? Или я вывожу не с теми ключами?

Также непонятно, почему при выводе *t, *(t+1), *(t+2) и *(t+3) с ключом %u выводятся совершенно страшные числа типа 65504 или 65529 (это в случае если на вход подано 374735). *t же занимает один байт? Как может один байт иметь такое значение?

Приложение:

Отправлен: 12.04.2007, 00:50
Вопрос задал: Blackie (статус: Посетитель)
Всего ответов: 5
Мини-форум вопроса >>> (сообщений: 1)

Отвечает: ramok
Здравствуйте, Blackie!

Числа с плавающей имеют сложный формат, который определен стандартом IEEE.

Ознакомтесь
http://en.wikipedia.org/wiki/IEEE_754
http://subscribe.ru/archive/comp.soft.prog.9899/200404/28151235.html
http://onembedding.com/info/float/
Ответ отправил: ramok (статус: Практикант)
Ответ отправлен: 12.04.2007, 01:31
Оценка за ответ: 4
Комментарий оценки:
Формат вещественных чисел мне давно известен. Интерес представляет адресовать 2-м переменным разного типа одни и те же байты.
За примеры спасибо.

Отвечает: Пчелин Никита Игоревич
Здравствуйте, Blackie!

Думаю, что вы немного не верно определяете способ хранения переменной в памяти.

"Величина типа float занимает 4 байта. Из них 1 бит отводится для знака числа, 8 бит для порядка и 23 бита для мантиссы. Диапазон значений переменной от 3.14E-3 до 3.14E+3.""

То есть после того как вы считали 4 бита из памяти, вам надо их преобразовать, а именно получить самый первый бит 1го байта для определения знака, потом 8 бит для порядка. и оставшиеся 23 буду отвечать за порядок.

Ответ отправил: Пчелин Никита Игоревич (статус: 1-ый класс)
Ответ отправлен: 12.04.2007, 01:37
Оценка за ответ: 2
Комментарий оценки:
Мне не нужно их преобразовывать. Мне нужно было получить доступ до тех 4- байт и вывести их как int. А он каждый раз 0.

Отвечает: Ross
Здравствуйте, Blackie!

Если вы выводите значение типа signed char (знаковое) с ключом %u (Unsigned decimal integer) то при отрицательных значениях t будут получаться огромные результаты, т.к. знаковый бит в таком случае интерпретируется как часть числа
Ответ отправил: Ross (статус: 7-ой класс)
Ответ отправлен: 12.04.2007, 10:46
Оценка за ответ: 5

Отвечает: kool
Здравствуйте, Blackie!
>>Когда я присваиваю переменной f (типа float)
>>значение 1001 (дробная ч. равна нулю),
>>то *a выводится как 16384. Это, я так
>>понимаю, 4 байта переменной float,
>>интерпретированные уже как
>>unsigned int (мне именно это и нужно).
Вероятно у тебя компилятор создает 16 битный код.
Короче у тебя sizeof(unsigned int)==2.(Проверь).
А там (случай f=1000 и f=10) как раз первые два байта нулевые.
Нужно так unsigned long *a.
--------------------------------------------
Все правильно выводятся.
Чтобы выводились красиво нужно или
делать преобразование типов или
сразу задавать другой тип( см. приложение.)
Совет - пользуйся отладчиком, там все это очень хорошо видно.
Удачи!

Приложение:

---------
I am.

Ответ отправил: kool (статус: Студент)
Ответ отправлен: 12.04.2007, 10:47
Оценка за ответ: 5
Комментарий оценки:
Да, проблема похоже в 16-битном коде

Отвечает: Ilkras
Здравствуйте, Blackie!
Если вы пользуетесь Mocrosoft C++, то там числа float представляются в соответсвие с IEEE. Для того чтоб "посмотреть нутро" или записать туда можно воспользоваться определить bitfield тип, сделать на него кастинг и тогда уже писать что-нибудь в мантиссу и что-нибудь в экспоненту. Однако есть нюанс - эти числа могут быть в нормализованой форме и в ненормализованой. Я не знаю когда именно делается нормализация. Более того, это может меняться от версии компилятора к версии. Стало быть вам надо будет перед каждой ваше операцией по "лазанью в нутро" выполнять нормализацию.
Вобщем работа с числами с плавающей запятой не совсем тривиальная вещь.
Если же вы просто хотите преобразовать тип, то делайте кастинг - это инструкция компилятору преобразовать типы. Если хотите записать в float величину известную вам как целое двоичное число - опять же используйте кастинг.
Ответ отправил: Ilkras (статус: 6-ой класс)
Ответ отправлен: 14.04.2007, 10:15
Оценка за ответ: 3
Комментарий оценки:
Для начинающего программиста кастинг - незнакомый термин, извините...


Вопрос № 82.264
Please, помогите мне решить задачки!!!!!!!!!!!

Приложение:

Отправлен: 12.04.2007, 18:44
Вопрос задал: Player (статус: Посетитель)
Всего ответов: 3
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Mihasic
Здравствуйте, Player!

Я полные программы писать не буду, напишу лишь частичные алгоритмы решения.

Касательно второго задания (про точки). Условие попадания в круг:

if ((X[i] - 1/*x - центра*/)*(X[i] - 1) + (Y[i] - 1/*н - центра*/)*(Y[i] - 1) <= r*r) {
// попала
}

Пройтись в цикле по всем точкам и проверить эти условия - думаю не проблема

А если все же проблема - рекомендую взять учебник.

Приложение:

Ответ отправил: Mihasic (статус: 9-ый класс)
Ответ отправлен: 12.04.2007, 19:14

Отвечает: Пчелин Никита Игоревич
Здравствуйте, Player!

В приложение есть две программы, не факт что они совершенно подходят вам (например если вам надо рассматривать дробные координаты), но вы легко можете их подправить.

Приложение:

Ответ отправил: Пчелин Никита Игоревич (статус: 1-ый класс)
Ответ отправлен: 12.04.2007, 20:13

Отвечает: Терсков Сергей
Здравствуйте, Player!

Этот вопрос вы уже задавали 09.04.07 (http://rusfaq.ru/info/question/81742) и ответ на него я уже давал. Причем плюс к этим там была еще одна задача. На вский случай привожу код еще раз (для этих двух задач).

Приложение:

Ответ отправил: Терсков Сергей (статус: 7-ой класс)
Ответ отправлен: 13.04.2007, 02:39


Отправить вопрос экспертам этой рассылки

Приложение (если необходимо):

* Код программы, выдержки из закона и т.п. дополнение к вопросу.
Эта информация будет отображена в аналогичном окне как есть.

Обратите внимание!
Вопрос будет отправлен всем экспертам данной рассылки!

Для того, чтобы отправить вопрос выбранным экспертам этой рассылки или
экспертам другой рассылки портала RusFAQ.ru, зайдите непосредственно на RusFAQ.ru.


Форма НЕ работает в почтовых программах The BAT! и MS Outlook (кроме версии 2003+)!
Чтобы отправить вопрос, откройте это письмо в браузере или зайдите на сайт RusFAQ.ru.


© 2001-2007, Портал RusFAQ.ru, Россия, Москва.
Авторское право: ООО "Мастер-Эксперт Про"
Email: support@rusfaq.ru, тел.: +7 (926) 535-23-31
Авторские права | Реклама на портале
Версия системы: 4.50 (beta) от 15.04.2007
Яндекс Rambler's Top100

В избранное