Для изображения чисел с плавающей точкой в процессоре 8087 существует три формата данных. Два из них совпадают с предложенным ИИЭР стандартом для таких чисел. Короткий формат имеет 32 бита, а длинный - 64 бита. Третий формат определяет 80-битовые числа, и не совпадает со стандартом ИИЭР. Сопроцессор 8087 использует такой формат "промежуточного действительного числа", чтобы обеспечить очень высокую точность для промежуточных результатов вычислений.
У целых чисел каждая позиция числа соответствует степени 10. То есть число 1234 есть
1234=1000+200+30+4=1*10**3+2*10**2+3*10**1+4*10**0
Десятичная точка показывает границу между позицией, соответствующей 100, и дробной частью. В дробной части позиции снова являются степенями 10, но теперь эти степени 10 - отрицательные. Поэтому число 1.234 есть
1.234=1+0.2+0.03+0.004=
1*10**0+2*10**-1+3*10**-2+4*10**-3
Десятичная точка позволяет записывать дроби. Число 1/2 теперь выглядит как 1.5, а 1/4 выглядит как 0.25, и 1/5 выглядит как 0.2.
Поскольку каждая позиция десятичного числа отличается от соседней на степень 10, умножение числа на 10 эквивалентно сдвигу десятичной точки на одну позицию вправо. Аналогично деление на 10 сдвигает десятичную точку на позицию влево. Это свойство можно использовать для сдвига десятичной точки на соответствующее место: мы сдвигаем десятичную точку и одновременно корректируем число на же степень 10. Такое представление чисел называется представление "с плавающей точкой", поскольку десятичная точка "плавает" в числе; она больше не помечает абсолютное место между целой и дробной частями. Положение десятичной точки можно выбрать из соображений удобства, а затем умножить число на нужную степень 10, чтобы получить правильное значение.
Например, Солнце находится на расстоянии примерно 93000000 миль от Земли. С такой формой записи тяжело работать из-за обилия нулей. Можно записать это число в формате с плавающей точкой: 9.3*107. То есть 93000000 эквивалентно 9.3, умноженному на 10 в седьмой степени. Фактически,
93000000=9.3*10**7=93*10**6=930*10**5
и так далее. Мы можем двигать десятичную точку куда угодно, меняя степень 10.
Десятичное число с плавающей точкой состоит из двух частей. Значащая часть числа называется мантиссой. В предыдущем примере число 9.3 есть мантисса. На практике мантисса обычно находится в пределах 1<=мантисса<10; т.е. она может быть равна 1.3, 7.6 или 9.97. Другая часть числа с плавающей точкой - это порядок, степень, в которую нужно возвести 10 перед умножением его на мантиссу. То есть 9.3*107 имеет мантиссу 9.3 и порядок 7. Если основание системы счисления определено раз и навсегда, в нашем случае это 10, то для восстановления первоначального числа должны быть заданы только два числа - мантисса и порядок.
Представление с плавающей точкой позволяет записывать в компактном виде как очень большие (например, 1.234*1085) так и очень малые (1.234*10-85) числа. Чтобы записать те же числа без использования степени десяти, потребовались бы длинные строки, состоящие из нулей.Двоичные числа с плавающей точкой изображаются аналогично десятичным; отличие заключается в том, что основание системы счисления здесь 2, а не 10. Мантисса имеет значение 1<=мантисса<2, а порядок показывает степень 2. То есть число 1.101*10100 в двоичной форме означает, что мантисса 1.101 умножается на 24, или 16. Значение мантиссы определяется таким же позиционным способом, как и для десятичного числа, за исключением того, что основание теперь равно 2. Позиции, находящиеся справа от двоичной точки, представляют отрицательные степени двойки. Таблица на Фиг. 7.4 показывает значения первых пяти позиций.
Теперь мы можем вычислить десятичное значение числа из примера:
1.101b=1+1/2+1/8=15/8=1.625
10**100b=2**4=16
1.101*10**100B = (1+5/8)*16 = 26
Кроме того, мы могли бы вычислить это значение точно так же, как в случае десятичных чисел. Значение порядка показывает, на сколько позиций надо сдвинуть двоичную точку. В этом случае, поскольку значение порядка равно 4, двоичную точку надо сдвинуть на четыре позиции вправо. Поэтому
1.101*10**100B=11010B=26
Оба метода правильные и дают идентичные результаты. В первом случае вычисляется мантисса, затем она умножается на основание, возведенное в степень порядка; во втором случае сначала выполняется умножение, а затем вычисляется мантисса.
Двоичное значение Десятичное значение
-------------------------------------------
0.1 1/2
0.01 1/4
0.001 1/8
0.0001 1/16
0.00001 1/32
-----------------------------------------Фиг. 7.4 Отрицательные степени двух
Как же эти числа представляются в ЭВМ? Место, отводимое для числа с плавающей точкой, делится на два поля. Одно поле содержит знак и значение мантиссы, а другое содержит знак и значение порядка. Размер поля мантиссы определяет точность представления числа. Чем большее число бит отводится в ЭВМ под поле мантиссы, тем выше точность. Например, десятичная мантисса 1.234 более точная, чем мантисса 1.2. Две дополнительные цифры мантиссы дают возможность более точно передавать значение числа.
Для того, чтобы сохранить максимальную точность, вычислительные машины почти всегда хранят мантиссу в нормализованном виде. Это означает, что мантисса есть число, лежащее между 1 и 2 (1<=мантисса<2). Два соображения говорят в пользу нормализации. Во-первых, ни один незначащий нуль не дает никакого вклада в точность числа. (Это несправедливо для нулей, лежащих в конце числа; мы считаем, что число 1.000 более точно, чем число 1.0). Если в мантиссе с плавающей точкой появились незначащие нули, точность числа падает. Во-вторых, способ хранения мантиссы с плавающей точкой подразумевает, что двоичная точка находится на фиксированном месте. Фактически подразумевается, что двоичная точка следует после первой двоичной цифры. То есть нормализация мантиссы делает единичным первый бит, помещая тем самым значение мантиссы между 1 и 2. Для выполнения нормализации ЭВМ корректирует порядок числа на соответствующее значение.
При нормализации встречаются исключения. Наиболее очевидное исключение - нуль. В этом случае вся мантисса нулевая. Второе исключение не так очевидно, и возникает в случае приближения числа к нижней границе своего диапазона. Давайте разберемся, что это означает.
Точно так же, как длина мантиссы числа определяет его точность, длина поля порядка определяет диапазон числа. Поле порядка содержит степень двойки, и чем больше бит в этом поле, тем большее число может быть представлено.
Если под поле порядка (представленного в дополнительном коде) отведено три двоичных цифры, наибольшее представимое число есть 1.111 ... * 10011B. Мантисса - это число, чуть меньше двух, а множитель мантиссы равен 23, или 8. Поэтому максимальное число чуть меньше 16. Наименьшее ненулевое положительное число есть 1.000 ... * 10100B, или 1*2-4, или 1/16. Поскольку в числах с плавающей точкой для представления мантиссы не используется дополнительный код, диапазон отрицательных чисел такой же. В случае 3-битового порядка диапазон положительных чисел от 1/16 до 16, а отрицательных - от -16 до -1/16.
Значение порядка хранится не как число, представленное в дополнительном коде. Для упрощения вычислений значение порядка в ЭВМ хранится в виде смещенного числа. Это означает, что к действительному значению порядка прибавляется смещение перед записью его в память. Смещенным значение порядка делается для того, чтобы можно было сравнивать значения порядка с помощью обычной операции сравнения чисел с фиксированной точкой без знака. В частности, это полезно при сравнении двух чисел с плавающей точкой. Значения порядка и мантиссы записываются в одном элементе данных, причем порядок записывается перед мантиссой. В случае смещенного значения порядка программа может сравнивать числа побитно, начиная со старших позиций. Первое же неравенство показывает соотношение чисел, и больше не нужно учитывать никакие части чисел. Значение смещения определяется размером поля порядка. Давайте это рассмотрим на примере форматов данных сопроцессора 8087.
В сопроцессоре 8087 формат короткого действительного числа использует 32 бита, восемь из которых содержат значение порядка; таким образом, оно может находиться в пределах от - 128 до 127. Однако значение -128 зарезервировано для обозначения некоторого специального, а именно, неопределенного числа, так что значения порядка находятся в диапазоне от -127 до 127. Значение порядка - это не число, представленное в дополнительном коде. Сопроцессор 8087 прибавляет значение смещения 127 к значению порядка действительного числа перед тем, как его запомнить.Значение порядка Хранимое значение
---------------------------------------
-127 000H
-1 07EH
0 07FH
1 080H
127 0FEH