Как преобразовать число с плавающей точкой одинарной точности IEEE в десятичное значение

Поэтому я пытаюсь преобразовать 46bfc000 (который является числом с плавающей запятой в одинарной точности IEEE) в десятичное значение.

Я могу получить приблизительное значение, но не точное значение. Итак, вот моя работа для моей приблизительной стоимости:

1) Преобразовать в двоичный код:0100 0110 1011 1111 1100 0000 0000 0000

2) Найти b-exp: 141-127

3) Преобразовать после десятичного значения: 2 ^ -1 + 2 ^ -5... =.552726746

4) Теперь следуйте следующему формату уравнения: (1) знаковый бит * (1. + значение на шаге 3) * 2 ^ b-exp

5) Рассчитать: +1 X (1,5527226746) X 2^14 = 25439,87501

Теперь я знаю, что точное значение: 24544. Но мне интересно, есть ли способ для меня получить точное число, или невозможно преобразовать двоичный файл IEEE с одинарной точностью в десятичное значение?

2 ответа

Решение

Я выяснил уравнение, чтобы получить точное число двоичного представления, это: знак * 2 ^ b-exp * мантисса

Изменить: Чтобы получить правильную мантиссу, вам нужно только рассчитать его, начиная с дробной части двоичного файла. Так, например, если ваш дробный 011 1111...

Тогда вы бы сделали (1*2^-0) + (1*2^-1) + (1*2^-2)...

Продолжайте делать это для всех чисел, и вы получите свою мантиссу.

Вместо того, чтобы вычислять все эти биты за запятой, что является чертовски сложной работой, IMO, просто масштабируйте все на 2^23 и вычтите еще 23 из показателя степени для компенсации.

Это объясняется в моей статье о Delphi с плавающей точкой.

Первый декодер:

0 - 1000 1101 - 011 1111 1100 0000 0000 0000

Вставьте скрытый бит:

0 - 1000 1101 - 1011 1111 1100 0000 0000 0000

В шестнадцатеричном виде:

0 - 8D - BFC000

0x8D = 141минус смещение 127, это становится 14,

Мне нравится масштабировать вещи, поэтому расчет таков:

sign * full_mantissa * (exp - bias - len)

где full_mantissa - мантисса, включая скрытый бит, как целое число; смещение = 127 и len = 23 (количество битов мантиссы).

И тогда это становится:

1 * 0xBFC000 * 2^(14-23) = 0xBFC000 / 0x200 = 0x5FE0 = 24544

так как 2^(14-23) = 2^-9 = 1 / 2^9 = 1 / 0x200,

Другие вопросы по тегам