Float24 (24 бит с плавающей запятой) в Hex?

Я использую float 24 bit для хранения значения с плавающей запятой в компиляторе MRK III из NXP. Он хранит 24-разрядное значение с плавающей запятой как 3-байтовый шестнадцатеричный в памяти данных. Теперь, когда я использую преобразование с плавающей точкой IEEE 754, чтобы вернуть число обратно из двоичного в реальное, я получаю нечто очень странное.

Позвольте мне выразить это на примере -

Примечание: "так как мой компилятор поддерживает float 24 бит (вместе с float 32), я присваиваю значение примерно так".

Пример программы:

float24 f24test;
float f32test;

f32test= 2.9612;
f24test= (float24)f32test;

Вывод в окне отладки (глобальная переменная): -

f32test = 2.961200e+000
f24test = 2.9612e+000

Значения, хранящиеся в DM (одновременно в памяти данных), полученные из отладчика -

f32test = 40 3d 84 4d (in hex)

f24test  = 02 3d 84  (in Hex)

ПРОБЛЕМА: - Теперь, когда я пытаюсь преобразовать f32test = 40 3d 84 4d (in hex) в двоичном коде и затем обратно в плавающий с использованием IEEE 754, я мог бы получить 2,9612. Хотя в то же время, когда я пытаюсь конвертировать f24test = 02 3d 84 (in Hex) в двоичном коде, а затем обратно к плавающему с использованием IEEE 754, я не смог получить 2.9612 вместо какого-то странного значения

Я заглядываю на эту вики-страницу, чтобы узнать об арифметике с плавающей точкой: http://en.wikipedia.org/wiki/Single-precision_floating-point_format

Я запутался, почему он не работает для числа с плавающей точкой 24, если я использую один и тот же формат для 1-битного знака, 8-битного показателя и 15-битного Mantissa. (В поплавке 32 это 1 знаковый бит, 8-битная экспонента и 23-битная Мантисса.)

Любой из вас, ребята, может помочь мне вернуть значение 2.9612 от f24test = 02 3d 84 (in Hex)???

Пожалуйста, сделайте, я боролся с этим в течение последних 15 часов:(

Заранее спасибо:)

2 ответа

Решение

f32test = 40 3d 84 4d (в шестнадцатеричном формате)

f24test = 02 3d 84 (в шестнадцатеричном формате)

В форматах IEEE 754 с плавающей запятой показатель степени с плавающей запятой сохраняется со смещением. Очевидно, что тот, кто разработал 24-битный формат с плавающей запятой, на который вы ссылаетесь, не решил использовать ту же систему смещения, которая используется в двоичном коде IEEE 754, поскольку значения экспонентных битов двух представлений выше не совпадают, несмотря на показатели обоих представлены 8 битами (по вашему мнению).

В 32-битном представлении показатель степени представлен битами 0x80, что звучит как раз для представления значения между 2 и 4.

Вы можете начать с гипотезы о том, что показатель степени в 24-битном формате имеет смещение 0x04, и подтвердить это большим количеством значений. Нам не хватает одного значения, чтобы иметь смысл 24-битного формата с плавающей запятой, который не является частью стандарта IEEE 754 и, очевидно, разработан с некоторыми экзотическими вариантами.

Я предполагаю, что это старый пост, но я дополню это опытом, который я прохожу прямо сейчас...

Я также пытаюсь выяснить, как NXP представляет тип данных float24. Я пишу небольшой тестовый макрос, который будет вставлен в гораздо больший фрагмент кода, и я пытаюсь использовать тип данных float24, поскольку обычный тип данных float, кажется, вызывает проблемы (я стажер, поэтому я не уверен, почему это вызывает проблемы, возможно, цель, для которой я пишу код, не может поддерживать 32-разрядные числа с плавающей запятой?).

Были некоторые заметки от другого инженера в большем куске кода, где говорится что-то вроде этого...

 /* ByteValue[0] : mantissa bits m7..m0
    ByteValue[1] : sign bit, mantissa bits m14..m8
    ByteValue[2] : exponent e7..e0 (signed, 2s complement repres.)
    Actual value is
    f = s * ( 2^(-1) + m14 * 2^(-2) + ... m0 * 2^(-16) ) * 2^e */

К сожалению, эта новая информация по-прежнему загадочна (что такое смещение? Предполагается, что это смещение? Что такое переменная '?) Предполагается, что это означает знаковый бит, почему он умножается на мантиссу после умножения может подразумевать результат, равный 0, если бит знака равен 0? и т. д.).

Однако это может показать, что структура этого числа отличается. Знаковый бит больше не является MSB, он указан сразу после экспоненты. Это также подразумевало бы, что в вашем случае показатель степени равен +2 (поскольку ваш шестнадцатеричный номер начинается с 0x02, и это соответствует ByteValue[2]).

Надеюсь, это поможет кому-нибудь наткнуться на этот пост. Я все еще пытаюсь решить это сам. Пожалуйста, отправляйте любые новые мысли.