Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Алгоритмы > Спец формат -> IEEE-754


Автор: chaos 23.9.2008, 12:24
День добрый!
Сижу уже 20 минут не получается сконвертировать число из памяти в формат IEEE-754.

В документации написано:
Код

Числа    с   плавающей     точкой     являются   основным     способом представления арифметической информации и занимают в памяти четыре подряд расположенных байта (в порядке увеличения адреса):
•  байт 1 - увеличенный на десятичное 128 (т.е. на шестнадцатиричное 80) двоичный порядок;
•  байты 2,3,4 - 23-разрядная двоичная нормализованная мантисса со знаком в прямом коде, без
   скрытых разрядов. Знак числа содержится в старшем (седьмом) бите байта 2, равен “0” для
   положительных чисел и “1” для отрицательных. Байт 2 содержит наиболее значащие разряды, байт
   4 – наименее значащие. Числа нормализованные, и для всех чисел, кроме строгого нуля, шестой бит
   байта 2 содержит двоичную единицу.


имеется 2 примера:
  • 85 65 72 B0 -> 25,362 
  • 8A 51 40 00 -> 650
может кто сообразит? smile

Заранее благодарен!

Добавлено через 4 минуты и 46 секунд
не совсем понятно чот дальше делать после:
1. выделил порядок: (value & 0xFF000000) >> 24
2. выдкелил знак числа (value & 0x00800000)
3. выделил мантису (value & 0x007F0000)

вот есть уменя три состовляющих

Автор: Akina 23.9.2008, 12:36
Цитата(chaos @  23.9.2008,  13:24 Найти цитируемый пост)
3. выделил мантису (value & 0x007F0000)

value & 0x007FFFFF

Добавлено через 2 минуты и 27 секунд
Вот только я не понял - что во что конвертим...

Автор: chaos 23.9.2008, 12:42
Цитата(Akina @ 23.9.2008,  09:36)
value & 0x007FFFFF

Добавлено @ 12:39
Вот только я не понял - что во что конвертим...

ага 0x007FFFFF. ошибся. сегодня не соображаю.
конвертим странный формат данных описанный выше в стандартный IEEE-754

Добавлено @ 12:52
PS те необходимо из 8A 51 40 00(650) получить 00 80 22 44(650)

Автор: Akina 23.9.2008, 13:47
Цитата(chaos @  23.9.2008,  13:24 Найти цитируемый пост)
8A 51 40 00 -> 650

Мантисса = 514000 bin, Для перевода в целые надо домножить на 2^23, т.е. мантисса (после перевода в десятичку) = 5324800 / (2^23)
Знак - положительный.
Порядок - 8А-80 = 0А = 2^10

Итого число = 5324800 / (2^23) * (2^10) = 650

Добавлено через 2 минуты и 44 секунды
А вот как соотносится 650 и 00 80 22 44 - я чтой-то не понимаю...

Добавлено через 8 минут и 53 секунды
Аналогично 85 65 72 B0 -> 25,362 

Мантисса = 6572B0 bin, Для перевода в целые надо домножить на 2^23, т.е. мантисса (после перевода в десятичку) = 6648496 / (2^23)
Знак - положительный.
Порядок - 85-80 = 5 = 2^5

Итого число = 6648496 / (2^23) * (2^5) = 25,36199951171875, ну можно считать что 25,362 

Автор: chaos 23.9.2008, 14:35
Akina, опа! все так просто. smile Спасибо!

а вот не понял только куда засунуть знак? если число отрицательное.

Добавлено через 8 минут и 38 секунд
а ,понял, если бит знаковый 1, то домнажаем на -1.
прикольный алгоритм smile а я устал уже двигать биты.

Автор: chaos 23.9.2008, 15:07
Akina, тока я не совсем понял алгоритм smile как так?

Автор: Akina 23.9.2008, 17:02
а в чем собсно проблема?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)