![]() |
|
![]() ![]() ![]() |
|
bint |
|
|||
Новичок Профиль Группа: Участник Сообщений: 6 Регистрация: 29.12.2007 Репутация: нет Всего: нет |
Задача имеет принципиальное значение, т.к. плавающая запятая вообще не рассматривается. т.к. формат данных в программе не подразумевает ее использование.
Устройство присылает пакет из данных, в котором по адресу addr прописывает число в формате float. Пример: 4B D0 67 42 - это число 57.9534... Нужно выделить мантиссу числа - 579534, порядок - 2 и знаки. Кто-то сможет помочь с этим? Добавлено через 1 минуту и 47 секунд Все что смог найти никак не помогло. Мантисса получается 68****** и т.д. Реально замучился. |
|||
|
||||
JAPH |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 312 Регистрация: 8.1.2007 Где: Ленобласть Репутация: 5 Всего: 23 |
4267D04B
0 10000100 11001111101000001001011 знак = 0 = "+" смещённый порядок = 10000100 = 132, несмещённый = 5 мантисса = 11001111101000001001011 число = 1,11001111101000001001011 << 5 = 111001,111101000001001011 = 57,953582763671875 -------------------- Что непонятно - спрашиваем ![]() |
|||
|
||||
bint |
|
||||||
Новичок Профиль Группа: Участник Сообщений: 6 Регистрация: 29.12.2007 Репутация: нет Всего: нет |
Подождите-подождите! Ради всего святого, помедленнее. Я ничего не понял.
Объясните пож. почему несмещенный 5.
Это понятно.
Как получилось это число? Его то мне и нужно. У меня не получается .953582763671875 Что нужно сделать чтобы получить дробную часть? И пож. объясните как первокласснику: это на это плюс это. Это сообщение отредактировал(а) bint - 29.12.2007, 21:13 |
||||||
|
|||||||
JAPH |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 312 Регистрация: 8.1.2007 Где: Ленобласть Репутация: 5 Всего: 23 |
Формат числа таков:
старший бит = знак, 8 бит = порядок + 127 (127=смещение), младшие = мантисса. Число = 1,мантисса * 2^порядок -------------------- Что непонятно - спрашиваем ![]() |
|||
|
||||
bint |
|
|||
Новичок Профиль Группа: Участник Сообщений: 6 Регистрация: 29.12.2007 Репутация: нет Всего: нет |
Огромное спасибо, хотя так ничего и не понял.
Расскажите как простыми действиями получить отдельно целую часть и дробную из 4-х байт числа. А что означает этот знак "^" ? |
|||
|
||||
JAPH |
|
||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 312 Регистрация: 8.1.2007 Где: Ленобласть Репутация: 5 Всего: 23 |
^ - возведение в степень.
Итак. Разбиваем число на 1бит+8бит+23бит.
1 бит отвечает за знак, 0 = "+", 1 = "-". 8бит - это смещённый порядок. Несмещённый порядок = смещённый - 127. 23бит = мантисса. Далее
Что конкретней непонятно? -------------------- Что непонятно - спрашиваем ![]() |
||||
|
|||||
bint |
|
||||
Новичок Профиль Группа: Участник Сообщений: 6 Регистрация: 29.12.2007 Репутация: нет Всего: нет |
Давайте по порядку разберемся.
Спасибо, это понял.
Скажите, зачем нужен "смещенный" порядок и зачем "несмещенный". Каковы функции этих порядков? Видите ли, для Вас это просто, а для это пока "китайская грамота". Вот, смотрю на нее и нифига не понимаю. А разобраться необходимо. |
||||
|
|||||
JAPH |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 312 Регистрация: 8.1.2007 Где: Ленобласть Репутация: 5 Всего: 23 |
1. чтобы число ноль хранить как 00000000000000000000000000000000, тогда несмещённый порядок = -127, а 2^-127 - эт мало. 2. чтобы не мучаться со знаком ещё и для порядка ![]() Обычное число 111001,111101000001001011 приводится к виду 1,11001111101000001001011 * 2^00000101, где 00000101 - несмещённый порядок. Далее к нему прибавляется 127, получаем смещённый порядок 10000100. Мантисса - всё, что в дробной части после 1,. саму единицу перед запятой пишут только в 10байтном формате. Добавлено через 2 минуты и 54 секунды число хранится в экспоненциальной форме. Аналог 1.345E-5. 1,11001111101000001001011 * 2^00000101. Т.е. добиваются, чтоб в целой части оказалась только единица. Это сообщение отредактировал(а) JAPH - 29.12.2007, 22:16 -------------------- Что непонятно - спрашиваем ![]() |
|||
|
||||
bint |
|
|||
Новичок Профиль Группа: Участник Сообщений: 6 Регистрация: 29.12.2007 Репутация: нет Всего: нет |
Прошу прощения за бестактный вопрос - Вы не стукнетесь ко мне в асю, т.к. Вашей аси я не нашел. Пожалуйста, это очень важно.
|
|||
|
||||
JAPH |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 312 Регистрация: 8.1.2007 Где: Ленобласть Репутация: 5 Всего: 23 |
Задача свелась к тому, что нужно из числа в формате с плавающей точкой выделить знак, целую часть и семь первых цифр дробной части. Решение -
-------------------- Что непонятно - спрашиваем ![]() |
|||
|
||||
bint |
|
|||
Новичок Профиль Группа: Участник Сообщений: 6 Регистрация: 29.12.2007 Репутация: нет Всего: нет |
Не ожидал такого понимания! Респект JAPH-у!
И конечно не ожидал такого виртуозного владения ассемблером - в течение нескольких минут готовый, оптимизированный код. У меня просто слов нет. Или может просто раньше не попадались мастера, поэтому так удивительно. Наверное это подарок мне на НГ. ![]() |
|||
|
||||
dumb |
|
|||
![]() sceloglauxalbifacies ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2929 Регистрация: 16.6.2006 Репутация: 7 Всего: 158 |
||||
|
||||
W4FhLF |
|
|||
![]() found myself ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2831 Регистрация: 2.12.2006 Репутация: 1 Всего: 121 |
Вообще-то есть специальные команды для этого: FXTRACT F2XM1 FSCALE.
-------------------- "Бог умер" © Ницше "Ницше умер" © Бог |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Asm для начинающих" | |
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, MAKCim. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Asm для начинающих | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |