Во-первых, 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
.