Существует три формата чисел с плавающей точкой, поддерживаемых
сопроцессором 8087. Эти форматы показаны нп Фиг. 7.1 и 7.2. На
Фиг. 7.1 показана логическая структура чисел, а на Фиг. 7.2 показано
расположение отдельных частей числа, когда оно записывается в
память.
Короткие и длинные форматы данных соответствуют предложенному
ИИЭР стандарту для представления чисел с плавающей точкой.
Короткое действительное число занимает 32 бита, или четыре байта
памяти. Этот формат часто называют числом с плавающей тоской
обычной точности. Его мантисса содержит 23 бита, что по точности
приблизительно соответствует шести - семи десятичным цифрам. То
есть семизначное десятичное число по точности примерно
соответствует 23-битовому двоичному числу. Восьмибитовое поле
порыдка имеет значение смещения 127, или 07FH. Значение порядка
лежит в диапазоне от -127 до 127, что приблизительно соответствует
диапазону от 10**-38 до 10**38. Оставшийся бит определяет знак
всего числа. Заметим, что внутри чисоа с плавающей точкой есть два
знаковых бита. Один из них - знак порядка, содержащийся внутри
поля порядка (модифицирующийся смещением). Другой знак показывает,
что отрицательно или положительно само число.
Длинный действительный формат числа занимает 64 бита, или
восемь байтов памяти. Это число удвоенной точности имет 52-
битовую мантиссу, что по точности соответствует примеоно 15- 16
десятичным цифрам. Одиннадцатибитовый порядок имеет диапазон от
2**-1023 до 2**1023 и значение смещения 1023, или 03FFH. В десятичной
форме это соответствует диапазону от 10**-307 до 10**307.
Сопроцессор 8087 всегда хранит в памяти длинные и короткие
действительные числа в нормализованном
виде. В это означает, что
первый бит мантиссы всегда единичен; и
поэтому хранить его
бессмысленно, но всегда подразумевается,
что он присутствует, как
показано на Фиг. 7.2. Под изображением расположения данных длинных
и коротких действительных чисел показана 1
перед двоичной точкой.
Этот разряд отсутствует в памяти, но
известно, что он на самом деле
существует.
Заметим теперь, что все шесть форматов
данных сопроцессора
8087, которые были рассмотрены - четыре
целых и два действительных
- существуют только за пределами
процессора. То есть сопроцессор
8087 переводит данные в эти форматы только
тогда, когда записывает
их в память; кроме того, он может читать
данные, записанные в
память в этих форматах. В сопроцессоре 8087 данные всех типов
хранятся в седьмом формате -
промежуточном, или временном
действительном. Это означает, что программа, в которой вы
работаете с сопроцессором 8087, использует
преимущества
расширенного диапазона и точности
временного действительного числа
только тогда, когда данные обрабатываются
внутри процессора 8086.
Другие форматы данных существуют для
удобства их хранения и
представления вне процессора.
Временное действительное число является
наиболее точным и имеет
большой диапазон. Оно представляется 80 битами или 10 байтами.
Его мантисса имеет длину 64 бита, это дает
точность, эквивалентную
примерно 19 десятичным цифрам. Мантисса в общем случае
нормализована, но в некоторых случаях
может оказаться
денормализованной. По этой причине временный действительный формат
уже не пожразумевает, что старший бит
мантиссы равен 1. На Фиг. 7.2
старшая нормализованная единица показана
явно частью мантиссы, а не
чем-то подразумеваемым. Пятнадцатибитовое поле порядка смещается
значением 16383, или 03FFFH. Такой порядок допускает диапазон
изменения чисел от 2**-16383 до 2**16383,
или примерно от 10**-4932 до
10**4932.
Поскольку сопроцессор 8087 может денормализовать мантиссу
временного действительного числа, нижняя
граница его расширяется
еще дальше. Так как число денормализовано, в мантиссе есть
незначащие нули, и это позволяет
изобразить даже меньшее число, чем
допускает диапазон значений порядка. Например, давайте снова
рассмотрим простую форму числа с плавающей
точкой, содержащую
3-битовое поле порядка и 4-битовую
матиссу. Наименьшее
положительное число, которое здесь может
быть представлено, есть
1.000*10000B=1*2**-3=1/8
В этом примере подразумевается: что значение порядка смещено
на значение 3. Если теперь мя денормализуем мантиссу, то сможем
представить даже меньшее число, например
0.100*10000B=1/2*2**-3=1/16
а наименьшее положительное число, которое
можно представить
денормализацией мантиссы есть
0.001*10000B=1/8*2**-3=1/64
Денормализация мантиссы расширяет нижнюю
границу диапазона
чисел.
Этот дополнительный диапазон дается не
даром. Поскольку мы
ввели незначащие нули, точность мантиссы
уменьшилась. Временный
действительный формат числа дает
возможность пожертвовать точностью
ради расширения диапазона числа, когда это
необходимо. Такая
возможность требуется в первую очередь на
промежуточных шагах
длительных вычислений. Иногда прикладная программа вычитает два
примерно одинаковых числа перед
выполнением другой операции, и
результат много меньше, чем любое из
исходных чисел. Эта разность
может оказаться очень важной. В таких специальных случаях
вычисления можно продолжать, допуская
расширение диапазона
представления числа. Единственной альтернативой здесь была бы
установка нулевого результата вычитания, а
в этом случае всякая
значимость теряется.