Каждая ЭВМ использует для представления чисел фиксированное количество двоичных разрядов. Их называют обычно разрядной сеткой ЭВМ.
Представим, что в условной ЭВМ (например, на калькуляторе) разрядная сетка содержит 10 десятичных разрядов:
1 2 3 4 5 6 7 8 9 10
Произвольное число в общем случае имеет целую и дробную части. Следовательно, в разрядной сетке нужно установить границу между этими частями.
Поставим разделяющую запятую, например, между шестым и седьмым разрядами. Тогда первые 6 разрядов сетки представляют целую часть числа, а последние 4 разряда - его дробную часть. Максимальное значение числа в этом случае равно 999999,9999; минимальное - 0,0001. Следовательно, при такой разрядной сетке обработка чисел может быть организована лишь в диапазоне 0,0001 .. 1000000, что явно недостаточно.
Если в разрядной сетке машины запятая, разделяющая целую и дробную части числа, фиксирована в заранее определенной позиции, то получаемые в этом случае числа называют числами с фиксированной запятой.
В ЭВМ, как правило, применяют один из двух способов представления чисел с фиксированной запятой:
1) запятая фиксирована перед старшим разрядом; в этом случае число имеет только дробную часть и не имеет целой части;
2) запятая фиксирована после младшего разряда; в этом случае число имеет только целую часть и не имеет дробной части.
Наиболее часто применяется второй способ.
Числа с плавающей запятой имеют следующую форму представления:
,
где - мантисса; - порядок; 10 - основание системы счисления, записанное в этой же системе ( = 2 ; = 8 ; = 16 ). Это так называемая экспоненциальная (или показательная) форма записи числа.
Например, число 358,5 можно записать в виде
0,3585 × = 358,5 × = 3585,0 × = 0,003585 × .
Чтобы обеспечить единственность представления числа, на мантиссу накладывается следующее ограничение:
0,1 £ < 1 ( в данной c/c).
Следовательно, мантисса - это дробь, в которой первая цифра должна быть значащей, т.е. не равной нулю. Такое представление числа с плавающей запятой называется нормализованным. В рассмотренном выше примере нормализованным является первый вариант представления заданного числа.
В разрядной сетке машины часть разрядов выделяется для мантиссы, а часть - для порядка числа.
Предположим, что в приведенной ранее разрядной сетке для мантиссы отведено 8 разрядов, а для порядка - 2 разряда (знак числа и знак порядка временно не рассматриваются). Тогда максимальное значение мантиссы составляет 0,99999999 , что примерно равно 1; максимальное значение порядка равно 99; число имеет максимальное значение 1 × , что достаточно для любых практических применений.
Сравним выполнение операции сложения для чисел с фиксированной запятой (целых чисел) и чисел с плавающей запятой.
Пусть = 78535, = 416. В формате целых чисел они имеют вид = 0000078535, = 0000000416. Их сумма получается по обычному правилу сложения:
0 0 0 0 0 7 8 5 3 5
+ 0 0 0 0 0 0 0 4 1 6
¾¾¾¾¾¾¾¾¾
0 0 0 0 0 7 8 9 5 1
В формате с плавающей запятой заданные числа имеют вид
= 0,78535 × , = 0,416 × ,
или в машинном представлении = 7853500005, = 4160000003.
Непосредственно складывать мантиссы, если слагаемые имеют разные порядки, нельзя. В этом случае сложение должно выполняться в следующей последовательности:
1) Определяется разница порядков слагаемых ; здесь имеем = 2.
2) Если D > 0, то сдвигается вправо на D разрядов; если D < 0, сдвигу подвергается ; при D = 0 сдвиг не производится.
В данном примере после сдвига получим:
= 0,78535000; = 0,00416000
3) Выполняется сложение мантисс
= 0,78951000
4) Результату приписывается максимальный из порядков слагаемых
= max( ) = 5
В результате получаем
= 7895100005
При сложении мантисс может иметь место случай > 1 (например, для = 0,8 × , = 0,7 × ) . Тогда получаемый результат нужно нормализовать, т.е. суммарную мантиссу сдвинуть на один разряд вправо, а к порядку добавить 1.
Из примера видно, что способ сложения чисел с плавающей запятой более сложный по сравнению со сложением целых чисел. Следовательно, для выполнения арифметических операций над числами с плавающей запятой требуется больше машинного времени процессора, чем для выполнения таких же операций по отношению к целым числам. В связи с этим практически в любой ЭВМ числа представлены как в формате с фиксированной запятой, так и в формате с плавающей запятой. При программировании рекомендуется применять в первую очередь целые числа, если это возможно по условиям задачи. Обычно целочисленные переменные в программе определяют объекты, которые могут принимать только целые значения (количество предметов, порядковый номер предмета и т.п.). Числа с плавающей запятой отображают вещественные числа, которые в технических задачах определяют, как правило, результаты измерения каких-либо параметров (длина, вес, площадь, время и т.п.).
В заключение рассмотрим вопрос о происхождении названия "число с плавающей запятой".
Пусть в разрядной сетке условной машины содержится число
|¾¾¾¾¾¾¾¾¾¾¾ u ¾¾¾¾¾¾¾¾¾®|¾ p ¾®|
т.е. число = 0,586591 × = 5,86591 .
Если рассматривать его как число с фиксированной запятой, то разделяющая запятая должна быть поставлена после первого разряда ( = 1 ).
Для числа
запятая будет установлена после второго разряда ( = 58,6591; = 2).
Для числа
запятая устанавливается после третьего разряда ( = 586,591) и т.д.
При этом создается впечатление, что запятая "плавает" по разрядной сетке при изменении порядка числа.