| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Алгоритмы > Необычный перевод числа с плавающей точкой |
| Автор: NullModemUser 15.8.2014, 13:34 | ||
| Здравствуйте! Работая с протоколом одной железяки, наткнулся на поле, что хранит температуру. Хранит оно в формате числа с плавающей точкой. Но не как в IEEE-754. Автор, в документе протокола приводит следующее описание с примером (привожу как в документе, БЕЗ опечаток, 1 к 1):
Помогите, пожалуйста, разобраться. Как перевести, скажем температуру 27,33 в данный формат представления числа. И наоборот. Заранее спасибо! |
| Автор: AVA12 15.8.2014, 14:32 | ||
| Да, в принципе, все понятно. Формат, в целом, похож на число одинарной точности (single), только лишний бит мантиссы откусил часть экспоненты. Плюс смещение экспоненты другое. Ну и поля переставлены. Будем работать с числом в новом формате, как с 32-битным целым, порядок байтов - LE (aka "интеловский"). В таком случае между новым форматом и single будут следующие соответствия:
|
| Автор: AVA12 15.8.2014, 15:49 |
| На всякий случай о представлении нуля: если все биты и мантиссы, и экспоненты - нулевые, то при переводе в другой формат соответствующие биты должны остаться нулевыми. Как быть с денормализованными числами и нечислами - непонятно, но, раз уж железка хранит значения температуры, то такие случаи вряд ли встретятся |
| Автор: NullModemUser 15.8.2014, 16:26 |
| AVA12, огромное спасибо! Но можете еще помочь... Смотрите. Мы имеем число-константу 1.000258. Железяка нам его выдает в виде: ED 03 71 82h С экспонентой в принципе понятно, но мантисса у него вообще иная выходит, чем у идентичного сингла. Распишите пожалуйста, как Вы его переводите в single... |
| Автор: AVA12 15.8.2014, 17:11 |
| А ты уверен, что это именно 1.000258? Если верить описанию формата, ED 03 71 82 должно представлять -18358002335612930. А с другим порядком байт - чуть больше 3.7 |
| Автор: NullModemUser 20.8.2014, 09:53 | ||
| AVA12, спасибо за за помощь! Таки да, ошибся я с числом, криво разобрал наснифанный пакет. В итоге привожу Дельфячный код (переложить на С++ или т.п. элементарно, написано крайне просто):
|