Вещественные числа

Вещественное число в цифровой технике представить значительно сложнее, нежели натуральное. Развивая тему знакового целочисленного, когда один разряд отводится под знак, можно таким же образом представить и вещественное: некоторое количество разрядов отвести под целочисленную часть, а остальные — под дробную.

Существует два общепринятых способа записи вещественного числа: с использованием фиксированной (англ. 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

Как видите, представление вещественного числа не такое и простое дело, кроме того, существует ряд неопределенностей, о которых вы можете прочитать в сторонних источниках. Мы не будем их рассматривать, так как нам не требуется такое глубокое понимание.

0

Изменено:

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.