Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Клуб программистов > Свободное общение
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 28.07.2009, 10:43   #1
Serval
Пользователь
 
Регистрация: 20.01.2009
Сообщений: 26
Вопрос Перевод пакетных данных в float число

From Stilet: Пусть этот топик будет статьей. Я его в Свободное общение перенесу как заметку

Приходит некий пакет данных в нем есть данные 4 байта - "42 59 11 c7"

данные в "формате Motorola (MSB->LSB), то есть для преобразования этих чисел в формат Intel, применяемый в PC-совместимых компьютерах, необходимо поменять порядок байт на обратный"

Последний раз редактировалось Stilet; 28.07.2009 в 13:10.
Serval вне форума Ответить с цитированием
Старый 28.07.2009, 12:52   #2
Serval
Пользователь
 
Регистрация: 20.01.2009
Сообщений: 26
Смущение

Преобразование двоичного числа с плавающей точкой в 32 битный формат IEEE754

формула F= (-1)^s*2^(E-127)*(1+M/2^23)

где:
S- бит знака (31 бит)
E- смещенная экспонента (23-30 биты)
M - остаток от мантиссы (0-22 биты)
F- десятичное число с плавающей точкой


Формат числа таков:
старший бит = знак,
8 бит = порядок + 127 (127=смещение),
младшие = мантисса.


берем 42 59 11 c7 и преобразуем в бинарный вид получаем 1000010010110010001000111000111

разбираем полученное

0 10000100 10110010001000111000111 (1бит 8бит 23бита - первый бит=0 поэтому например в калькуляторе его непокажут - отсчитывайте с конца)

0=S - знак "+" (1 это "-")
10000100=132=Е - смещенная экспонента
1011001000100011100011 - мантисса ( Но, у нормализованной двоичной мантиссы первый бит всегда равен 1, так как число лежит в диапазоне 1<=M<2. Нет смыла, записывать единицу в отведенные 23 бита, поэтому в отведенные 23 бита записывается остаток от мантиссы.)
дописываем "1", получаем 11011001000100011100011=7112931=M



F= (-1)^s*2^(E-127)*(1+M/2^23)=(-1)^0*2^(132-127)*(1+7112931/2^23)
=1*2^5*(1+7112931/8388608)=1*32*(1,84...)=59,13..... (небуду записывать все знаки)

вот как-то так все и получается.

реализация этого в программе думаю будет несложной.

Последний раз редактировалось Stilet; 28.07.2009 в 13:10.
Serval вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Перевод из строки в число и обратно AsmBeginer Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 10 22.05.2010 18:49
Как узнать что число не Float(без остатка) при результате деления? zotox Помощь студентам 7 19.07.2009 15:49
float to int span4 SQL, базы данных 7 01.06.2009 10:57
перевод/округление дробных данных в БД kate158 БД в Delphi 3 15.05.2009 16:08