Как преобразовать число с плавающей точкой одинарной точности 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
,