Как конвертировать 2+ (2/7) в IEEE 754 с плавающей запятой - PullRequest
0 голосов
/ 22 апреля 2011

Может кто-нибудь объяснить мне шаги для преобразования числа в десятичном формате (например, 2+ (2/7)) в представление IEEE 754 с плавающей точкой?Спасибо!

1 Ответ

1 голос
/ 23 апреля 2011

Во-первых, 2 + 2/7 не в том, что большинство людей назвали бы «десятичным форматом». «Десятичный формат» чаще используется для обозначения таких чисел, как:

2.285714285714285714285714285714285714285714...

Даже ... немного быстро и свободно. Чаще всего число будет обрезано или округлено до некоторого количества десятичных цифр:

2.2857142857142857

Конечно, на данный момент он больше не равен 2 + 2/7, но "достаточно близок" для большинства применений.

Мы делаем нечто подобное, чтобы преобразовать число в формат IEEE-754; вместо базы 10 мы начнем с записи числа в базе 2:

10.010010010010010010010010010010010010010010010010010010010010...

Затем мы «нормализуем» число, записав его в виде 2^e * 1.xxx... для некоторого показателя e (в частности, позиция цифры старшего бита нашего числа):

2^1 * 1.0010010010010010010010010010010010010010010010010010010010010...

На данный момент мы должны выбрать определенный формат IEEE-754, потому что нам нужно знать, сколько цифр нужно хранить. Давайте выберем «одинарную точность», которая имеет 24-битное значение. Округляем повторяющееся двоичное число до 24 бит:

2^1 * 1.00100100100100100100100  10010010010010010010010010010010010010...
           24 leading bits          bits to be rounded away

Поскольку конечные биты, которые необходимо округлить, больше 1000..., число округляется до:

2^1 * 1.00100100100100100100101

Теперь, как на самом деле это значение кодируется в формате IEEE-754? Формат с одинарной точностью имеет начальный бит знака (ноль, потому что число положительное), за которым следуют восемь битов, которые содержат значение 127 + e в двоичном виде, за которым следует дробная часть значимого и:

0 10000000 00100100100100100100101
s exponent fraction of significand

В шестнадцатеричном виде это дает 0x40124925.

...