Вещественные числа
Вещественное число в цифровой технике представить значительно сложнее, нежели натуральное. Развивая тему знакового целочисленного, когда один разряд отводится под знак, можно таким же образом представить и вещественное: некоторое количество разрядов отвести под целочисленную часть, а остальные — под дробную.
Существует два общепринятых способа записи вещественного числа: с использованием фиксированной (англ. fixed point) и плавающей запятой(англ. floating point).
В англоязычной литературе употребляется слово «точка» вместо «запятая».
25 февраля 1991 года во время войны в Персидском заливе американской противоракетной системе Пэтриот (англ. MIM-104 Patriot) не удалось отследить и перехватить иракскую ракету Скат. После удара по казарме 28 человек погибло, более сотни было ранено. В радиолокации любая цель отслеживается путём измерения времени, необходимого для того, чтобы радиоимпульсы достигли объекта и, отразившись от него, вернулись к станции. Расследование показало, что пропуск цели был вызван арифметической ошибкой из-за неточного вычисления времени. Оно записывалось как целочисленное число в десятых долях секунды, однако для вычислений преобразовывалось в 24-битное число с фиксированной запятой. Число 1/10 в двоичной системе представляется бесконечной последовательностью, которую ограничили 24 битами. После 100 часов работы погрешность составила порядка 0,34 секунды, за которые иракская ракета успевала пролететь полкилометра. // The Patriot Missile Failure
Числа с фиксированной запятой
В записи с фиксированной запятой часть битов используется для целочисленной части, остальные — для дробной. И, как понятно из названия, положение запятой не меняется, т. е. она находится в фиксированном положении. Возьмем 8-битную беззнаковую переменную и отведем 3 младших бита под дробную часть, остальные пять — под целочисленную (обозначается как Q5.3):

Число 10,75 можно представить в виде суммы степеней двойки. Запишем в двоичной системе:
10,7510 = 8 + 2 + 0,5 + 0,25 = 23 · 1 + 21 · 1 + 2-1 · 1 + 2-2 · 1 = 01010,1102
Язык Си не поддерживает арифметику с фиксированной запятой, однако такой тип данных может быть реализован средствами языка.
Числа с плавающей запятой
Альтернативный способ представления вещественных чисел — форма с плавающей запятой (например, для переменной одинарной точности, т.е. float
, занимающей 4 байта, существует стандарт IEEE 754). Данный формат является развитием идеи фиксированной запятой и использует экспоненциальную запись. Здесь число хранится в виде мантиссы (дробная часть, mant
; при этом перед мантиссой необходимо вставить 1.
при конвертации) и показателя степени (exp
), а значение числа можно найти по формуле:
x = (-1)sign · mant · baseexp
где base
— основание (2), а sign
— определитель знака числа. Графически представить это можно следующим образом:

Рассмотрим переменную с плавающей запятой.
[sign][exponent][ fraction]
[ 0][10001000][01101100001000000000000]
Рассчитаем экспоненту:
exp’ = 100010002 = 1 · 27 + 1 · 23 = 13610
Так как экспонента может быть как положительной, так и отрицательной, то диапазон нужно поделить пополам. Для вычисления среднего значения (смещения, от англ. bias) используется формула 2n-1-1. В нашем случае n = 8 (знаков под экспоненту), т.е. смещение равно 127. Тогда:
exp = exp’ — bias = 136 — 127 = 910.
Запишем мантиссу (при этом лишние нули справа можно отбросить для простоты восприятия), добавив неявную единицу спереди: 1,011011000012. Далее считаем по формуле само значение:
x = 1,01101100001 · 29,
операция умножения эквивалентна операции смещения на 9 порядков, тогда:
x = 1011011000,012,
Остается перевести число из двоичной системы в десятичную.
x = 1 · 29 + 1 · 27 + 1 · 26 + 1 · 24 + 1 · 23 + 1 · 2-2 = 512 + 128 + 64 + 16 + 8 + 0.25 = 728,2510
Как видите, представление вещественного числа не такое и простое дело, кроме того, существует ряд неопределенностей, о которых вы можете прочитать в сторонних источниках. Мы не будем их рассматривать, так как нам не требуется такое глубокое понимание.