![]() |
|
|
![]()
|
|
| NullModemUser |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 3 Регистрация: 15.8.2014 Репутация: нет Всего: нет |
Здравствуйте!
Работая с протоколом одной железяки, наткнулся на поле, что хранит температуру. Хранит оно в формате числа с плавающей точкой. Но не как в IEEE-754. Автор, в документе протокола приводит следующее описание с примером (привожу как в документе, БЕЗ опечаток, 1 к 1):
Помогите, пожалуйста, разобраться. Как перевести, скажем температуру 27,33 в данный формат представления числа. И наоборот. Заранее спасибо! |
|||
|
||||
| AVA12 |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 135 Регистрация: 4.5.2008 Репутация: 1 Всего: 4 |
Да, в принципе, все понятно. Формат, в целом, похож на число одинарной точности (single), только лишний бит мантиссы откусил часть экспоненты. Плюс смещение экспоненты другое. Ну и поля переставлены.
Будем работать с числом в новом формате, как с 32-битным целым, порядок байтов - LE (aka "интеловский"). В таком случае между новым форматом и single будут следующие соответствия:
|
|||
|
||||
| AVA12 |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 135 Регистрация: 4.5.2008 Репутация: 1 Всего: 4 |
На всякий случай о представлении нуля: если все биты и мантиссы, и экспоненты - нулевые, то при переводе в другой формат соответствующие биты должны остаться нулевыми. Как быть с денормализованными числами и нечислами - непонятно, но, раз уж железка хранит значения температуры, то такие случаи вряд ли встретятся
|
|||
|
||||
| NullModemUser |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 3 Регистрация: 15.8.2014 Репутация: нет Всего: нет |
AVA12, огромное спасибо! Но можете еще помочь...
Смотрите. Мы имеем число-константу 1.000258. Железяка нам его выдает в виде: ED 03 71 82h С экспонентой в принципе понятно, но мантисса у него вообще иная выходит, чем у идентичного сингла. Распишите пожалуйста, как Вы его переводите в single... |
|||
|
||||
| AVA12 |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 135 Регистрация: 4.5.2008 Репутация: 1 Всего: 4 |
А ты уверен, что это именно 1.000258? Если верить описанию формата, ED 03 71 82 должно представлять -18358002335612930. А с другим порядком байт - чуть больше 3.7
Это сообщение отредактировал(а) AVA12 - 15.8.2014, 17:45 |
|||
|
||||
| NullModemUser |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 3 Регистрация: 15.8.2014 Репутация: нет Всего: нет |
AVA12, спасибо за за помощь! Таки да, ошибся я с числом, криво разобрал наснифанный пакет.
В итоге привожу Дельфячный код (переложить на С++ или т.п. элементарно, написано крайне просто):
|
|||
|
||||
![]()
|
| Правила форума "Алгоритмы" | |
|
|
Форум "Алгоритмы" предназначен для обсуждения вопросов, связанных только с алгоритмами и структурами данных, без привязки к конкретному языку программирования и/или программному продукту.
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, maxim1000. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Алгоритмы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |