В этом формате возможно представление как вещественных, так и целых чисел с некоторой конечной точностью. Основан этот формат на следующем.
Любое число Х, представленное в системе счисления с основанием Р можно записать в виде
, (7)
где М – мантисса, |M| < 1, k – порядок числа (k – целое число). Число считается нормализованным, если выполняется условие
. (8)
Например, 37510 = 0.375∙103 или 10.12=0.101∙1010. В последнем случае и порядок и мантисса представлены в двоичном коде.
В ЭВМ числа в формате с плавающей точкой запоминаются и хранятся в виде двух групп цифр: нормализованная мантисса (очевидно без точки, отделяющей дробную часть от целой) и порядок.
Чем больше двоичных разрядов отводится под запись мантиссы, тем выше точность представления числа. Чем больше разрядов занимает порядок, тем шире диапазон от наименьшего отличного от нуля числа до наибольшего числа, представимого в машине при заданном формате.
В ЭВМ числа в форме с плавающей точкой обычно занимают двойное слово (4 байта - одинарная точность), расширенное слово (8 байтов - двойная точность) или десятибайтовое поле данных. Нормализованное число в формате с плавающей точкой, хранится в памяти компьютера следующим образом: самый левый бит отводится под знак мантиссы (31 бит - для одинарной точности, 63 бит – для двойной точности). Далее идут разряды порядка (8 бит для одинарной точности, 11 бит – для двойной точности). Оставшуюся часть поля данных занимает мантисса (23 бита для одинарной точности и 52 бита – для двойной точности). При этом порядок хранится в смещённом коде,то естьк настоящему значению порядка перед записью его в память прибавляется смещение (некоторое целое число).
В таблице 4 даны характеристики различных типов форматов с плавающей точкой для хранения чисел в разных языках программирования.
Для представления числа в форме с плавающей точкой необходимо:
· преобразовать модуль числа в двоичный код (отдельно целую часть и отдельно дробную часть) и значение порядка установить равным нулю;
· нормализовать полученное двоичное представление модуля числа (то есть сдвинуть точку влево или вправо на нужное количество разрядов так, чтобы выполнить неравенство (8)). При этом, каждый сдвиг влево точки увеличивает порядок на единицу, а каждый сдвиг вправо - уменьшает порядок на единицу;
· записать знак числа в самый левый бит поля данных;
· увеличить значение порядка на 128 (для одинарной точности) или на 2048 (для двойной точности);
· записать порядок в поле, отведённое под него;
· записать нормализованное значение модуля мантиссы в оставшуюся часть поля, отведённого под мантиссу;
· если число равно нулю, то, в этом случае, мантисса и порядок устанавливаются в ноль.
Примеры. Запишем число в форме с плавающей точкой одинарной точности. Порядок действий следующий: преобразуем число в двоичный код (отдельно целую, отдельно дробную часть) и после нормализации получим 3.(3)10 = 11.(01)2 = 0.11(01)2∙1022 ; формируем двоичный смещённый код порядка 210 Þ 00 000 0102 + 10 000 0002 = 10 000 0102 . Теперь заполняем два последовательных слова полученными кодами порядка и мантиссы с учётом округления (если первый отбрасываемый разряд мантиссы равен единицы, то к последнему её сохраняемому разряду добавляется единица):
Слово
Поле
Знак
Порядок числа
Мантисса
Номер разряда
Значение разряда
Слово
Поле
Продолжение мантиссы
Номер разряда
Значение разряда
Другой пример, число - 49.5. Преобразуем модуль числа в двоичный нормализованный код: 49.510 = 11 0001.12 = 0.11000112∙26 . Далее преобразуем порядок: 610 Þ10 000 1102 . Осталось заполнить полученными кодами двойное слово:
Слово
Номер разряда
Значение разряда
Слово
Номер разряда
Значение разряда
При выполнении арифметических операций над числами, представленными в формате с плавающей точкой, надо отдельно выполнять их для порядков и мантисс.При алгебраическом сложении порядки предварительно выравниваются по большему из них. Мантисса числа с меньшим порядком при этом сдвигается вправо на требуемое количество разрядов. После этого мантиссы алгебраически складываются.
Таблица 4
Язык
Числа в формате с плавающей точкой
4 байта
6 байт
8 байта
10 байт
Pascal
Single
Real
Double
Extended
C++
float
-
double
long double
Пределы изменения (примерно)
1,5×10-45 -3,4×1038
2,9×10-39 -1,7×1038
5,0×10-324 - 1,7×10308
±3.4∙104932
Точность представления числа (количество 10-ых цифр)
6-7
11-12
14-15
19-20
При умножении чисел порядки надо складывать, а мантиссы перемножать. При делении из порядка делимого вычитают порядок делителя, а над мантиссами совершают обычную операцию деления.
После выполнения операций необходимо провести нормализацию результата, если это потребуется, что приведет к изменению порядка. Это и объясняет термин «плавающая точка», так как величина порядка меняет положение точкой, отделяющей дробную часть от целой.
Возможно решение и обратной задачи (декодировании), по двоичному коду восстановить десятичное представление числа. Например, дано шестнадцатеричное представление числа в формате с плавающей точкой – C3EB1700. Распишем его двоичное представление:
Так как порядок смещённый, то вычтем из него 128: 10000111 – 10000000 = 1112 = 710 . Тогда: 0.11010110010111∙27 = 1101011.00101112 → 26 + 25 + 23 + 21 + 1 + 2-3 + 2-5 + 2-6+ 2-7 =