как работают числа с плавающей точкой IEEE-754 - PullRequest
9 голосов
/ 25 апреля 2010

Допустим, у меня есть это:

float i = 1.5

в двоичном виде, этот тип с плавающей запятой представлен как:

0 01111111 10000000000000000000000

Я разбил двоичный файл, чтобы представить куски со знаком, экспонентой и дробью.

Что я не понимаю, так это как 1,5.

Показатель степени равен 0 после вычитания смещения (127–127), а дробная часть с неявной ведущей равна 1,1.

Как 1,1 масштабируется ничем = 1,5 ???

Ответы [ 4 ]

25 голосов
/ 25 апреля 2010

Сначала подумайте в десятичном формате (основание 10): 643,72:

  • (6 * 10 2 ) +
  • (4 * 10 1 ) +
  • (3 * 10 0 ) +
  • (7 * 10 -1 ) +
  • (2 * 10 -2 )

или 600 + 40 + 3 + 7/10 + 2/100.

Это потому, что n 0 всегда равно 1, n -1 совпадает с 1 / n (для конкретного случая), а n -m равно идентично 1 / n m (для более общего случая).

Аналогично, двоичное число 1.1:

  • (1 * 2 0 ) +
  • (1 * 2 -1 )

с 2 0 , равным единице, и 2 -1 , равной половине.

В десятичной системе счисления числа слева от десятичной запятой имеют множители 1, 10, 100 и т. Д. Влево от десятичной запятой, а 1/10, 1/100, 1/1000 - направо (т. Е. 10 2 , 10 1 , 10 0 , десятичная точка, 10 -1 , 10 -2 ,. ..).

В base-2 числа слева от двоичной точки имеют множители 1, 2, 4, 8, 16 и т. Д. В левом направлении. Числа справа имеют множители 1/2, 1/4, 1/8 и т. Д., Направляясь вправо.

Так, например, двоичное число:

101.00101
| |   | |
| |   | +- 1/32
| |   +---  1/8
| +-------    1
+---------    4

эквивалентно:

4 + 1 + 1/8 + 1/32

или

    5
5  --
   32
7 голосов
/ 25 апреля 2010

1.1 в двоичном виде - 1 + .5 = 1,5

1 голос
/ 25 апреля 2010

Мантисса существенно сдвинута показателем степени.

3 in binary is 0011
3>>1 in binary, equal to 3/2, is 0001.1
0 голосов
/ 25 апреля 2010

Вы хотите прочитать это - IEEE 754-1985

Фактический стандарт здесь

...