Помимо базовых форматов, стандарт IEEE 754 также определяет расширенные (extended) форматы точности. Расширенный формат точности расширяет базовый формат, обеспечивая более высокую точность и более широкий диапазон представляемых чисел. Реализация расширенного формата может использовать любое внутреннее представление, определяемое выбором размеров мантиссы и порядка.
Так в одной из реализаций расширенного формата в сопроцессоре Intel используется 80 -разрядное представление чисел (long double) с размером мантиссы 64 бита и размером порядка 15 бит.
Алгоритм получения представления вещественного числа в памяти компьютера (слайд 6)
Порядок преобразования вещественного числа для представления его в памяти компьютера покажем на примере числа двойной точности (Double precision).
Значение этого формата занимает в памяти 8 байт (64 бита), при этом первый разряд (старший) отводится под знак всего числа, 11 разрядов – под порядок и 52 разряда – под мантиссу (рис. 6).
Знак | Смещенный порядок | Мантисса |
63 | 62..52 | 51..0 |
|
|
Рис. 6. Представление в памяти компьютера вещественного числа с плавающей запятой
Данный формат числа подразумевает наличие бита целой части мантиссы (он всегда равен 1) и двоичной запятой перед старшим (51-м) разрядом мантиссы, значения мантиссы находятся в диапазоне [1; 2). Для упрощения вычислений и сравнения вещественных чисел значение порядка хранится в виде смещенного числа (кода со сдвигом), т.е. к настоящему значению порядка перед записью его в память прибавляется смещение. Смещение выбирается так, чтобы минимальному значению порядка соответствовал нуль. В данном случае порядок занимает 11 разрядов и имеет диапазон от 2-1023 до 21023, поэтому смещение равно 210 – 1 = 102310 = 11111111112.
Таким образом, алгоритм для получения представления вещественного числа в памяти компьютера приобретает следующий вид:
1. Перевести модуль числа в двоичную систему счисления.
2. Нормализовать двоичное число, т.е. записать его в виде M × 2p, где M – мантисса (ее целая часть равна 12) и p – порядок, записанный в десятичной системе счисления;
3. Прибавить к порядку смещение и перевести смещенный порядок в двоичную систему счисления;
4. Дописать слева знак всего числа (0 – положительное; 1 – отрицательное).
Пример 1. Запишем код числа -312,3125.
1. Двоичная запись модуля этого числа имеет вид: 100111000,0101.
2. Имеем 1 0011 1000,0101 = 1,0011 1000 0101×28.
3. Получаем смещенный порядок 8+1023 = 1031. Далее имеем 103110 = 100 0000 01112.
4. Окончательно получаем:
1 | 100 0000 0111 | 0011 1000 0101 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 |
63 | 62..52 | 51..0 |
Полученный код более компактно можно записать в шестнадцатеричной системе следующим образом: C073 8500 0000 000016.
|
|
Другой пример иллюстрирует обратный переход от кода вещественного числа к самому числу в десятичной системе счисления.
Пример 2. Пусть дан код 3FEC 6000 0000 000016 или
0 | 011 1111 1110 | 1100 0110 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 |
63 | 62..52 | 51..0 |
1. Прежде всего, замечаем, что это код положительного числа, поскольку в самом старшем разряде (с номером 63) записан 0. Порядок этого числа: 011 1111 11102 = 102210; 1022 - 1023 = -1.
2. Число имеет вид 1,1100 011×2-1 или 0,1110 0011.
3. После перевода в десятичную систему счисления получаем: 0,88671875.
Диапазон значений и точность представления чисел с плавающей запятой (слайд 7)
Диапазон и точность представления чисел, которые можно записать в одном из рассмотренных форматов, зависит от количества разрядов, отведённых для представления мантиссы и показателя. Пара значений показателя (когда все разряды нули и когда все разряды единицы) зарезервирована для обеспечения возможности представления специальных чисел. К ним относятся ноль, значения NaN (Not a Number,
" не число ", получаются как результат операций типа деления нуля на ноль) и ±∞.
Таблица 1. Характеристики базовых форматов вещественных чисел с плавающей запятой
Название | Название | Диапазон | Размер переменной, бит | Размер мантиссы и порядка, бит | Точность, десятич. разрядов | |
Visual Basic | C++ | |||||
Single presicion | Single | float | 1,17×10-38.. 3,40×1038 | 32 | 23+8 | 7-8 |
Double precision | Double | double | 2,22×10-308.. 1,79×10308 | 64 | 52+11 | 15-16 |
В табл. 1 приведены характеристики двух базовых форматов вещественных чисел с плавающей запятой, поддерживаемых во всех универсальных языках программирования, в частности, Visual C++.
Представление специальных чисел для одинарной и двойной точности приведено в табл. 2.
Таблица 2. Представление специальных чисел
Число | Одинарная точность | Двойная точность | ||||
знак | порядок | мантисса | знак | порядок | мантисса | |
+0 | 0 | 0016 | 0 | 0 | 00016 | 0 |
−0 | 1 | 0016 | 0 | 1 | 00016 | 0 |
+∞ | 0 | FF16 | 0 | 0 | 7FF16 | 0 |
−∞ | 1 | FF16 | 0 | 1 | 7FF16 | 0 |
SNan | {0,1} | FF16 | любая ≠ 0 старший бит = 0 | {0,1} | 7FF16 | любая ≠ 0 старший бит = 0 |
QNan | {0,1} | FF16 | любая ≠ 0 старший бит = 1 | {0,1} | 7FF16 | любая ≠ 0 старший бит = 1 |
Здесь QNaN – так называемый “тихий” Nan, SNan – так называемый “сигнальный” Nan. Первый, попав в любую операцию, возвращает NaN, второй – вызывает аварийную ситуацию.