Аппаратное обеспечение IBM PC© Александр Фролов, Григорий ФроловТом 2, книга 1, М.: Диалог-МИФИ, 1992. 12.1. Вещественные числаПрежде чем говорить о форматах вещественных числе, используемых сопроцессором, вспомним о числах с плавающей точкой, встречающихся в научных расчетах. В общем виде эти числа можно записать следующим образом: (знак)(мантисса)*10(знак)(порядок) Например: -1.35*105 Здесь знак - это минус, мантисса - 1.35, порядок - 5. Порядок тоже может иметь знак. В этом представлении чисел для вас вряд ли есть что либо новое. Вспомним также такое понятие, как норамализованное представление чисел:
В чем преимущества использования нормализованных чисел? В том, что для фиксированной разрядной сетки числа (т.е. для фиксированного количества цифр в числе) нормализованные числа имеют наибольшую точность. Кроме того, нормализованное представление исключает неоднозначность - каждое число с плавающей точкой может быть представлено различными (ненормализованными) способами: 123.5678*105 = 12.35678*106 = 1.235678*107 = 0.1235678*108 Для тех, кто программировал на языках высокого уровня, знакомо следующее представление чисел с плавающей точкой: (знак)(мантисса)E(знак)(порядок) Например, -5.35E-2 означает число -5.35*10-2. Такое представление называется научной нотацией. Сопроцессор 8087/80287/80387 может работать с вещественными числами в трех форматах:
Эти числа занимают в памяти, соответственно, 4, 8
или 10 байтов: Одинарная точность 1 бит 8 бит 23 бита ---T-------T--------------------¬ ¦Зн¦Порядок¦ Мантисса ¦ L--+-------+--------------------- Двойная точность 1 бит 11 бит 52 бита ---T---------T--------------------------------¬ ¦Зн¦ Порядок ¦ Мантисса ¦ L--+---------+--------------------------------- Расширенная точность 1 бит 15 бит 64 бита ---T-------------T------------------------------------¬ ¦Зн¦ Порядок ¦ Мантисса ¦ L--+-------------+------------------------------------- В любом представлении старший бит "Зн" определяет знак вещественного числа:
Все равные по абсолютному значению положительные и отрицательные числа отличаются только этим битом. В остальном числа с разным знаком полностью симметричны. Для представления отрицательных чисел здесь не используется дополнительный код, как это сделано в центральном процессоре. Арифметический сопроцессор работает с нормализованными числами, поэтому поле мантиссы содержит мантиссу нормализованного числа. Так как здесь используется двоичное представление чисел, сформулируем определение нормализованного числа для двоичного представления:
Так как для нормализованного двоичного числа целая часть всегда равна единице, то эту единицу можно не хранить. Именно так и поступили разработчики арифметического сопроцессора - в форматах одинарной и двойной точности целая часть мантиссы не хранится. Таким образом экономится один бит памяти. Для наглядности представим мантиссу числа в следующей форме: n.nnnnnnnnnn...n Здесь символом n обозначается либо 0, либо 1. Нормализованные числа в самой левой позиции содержат 1, поэтому их можно изобразить еще и в таком виде: 1.nnnnnnnnnn...n Представление с расширенной точностью используется сопроцессором для выполнения всех операций. И даже более - все операции с числами сопроцессор выполняет над числами только в формате с расширенной точностью. В этом формате хранится и "лишний" бит целой части нормализованного числа. Основная причина использования для вычислений расширенной точности - предохранение программы от возможной потери точности вычислений, связанной с большими различиями в порядках чисел, участвующих в арифметических операциях. Поле порядка - это степень числа 2, на которую умножается мантисса, плюс смещение, равное 127 для одинарной точности, 1023 - для двойной точности и 16383 - для расширенной точности. Для того, чтобы определить абсолютное значение числа с плавающей точкой, можно воспользоваться следующими формулами:
Знак числа, как мы уже говорили, определяется старшим битом. Приведем конкретный пример. Пусть мы имеем число с одинарной точностью, которое в двоичном виде выглядит следующим образом: 1 01111110 11000000000000000000000 Для этого числа знаковый бит равен 1 (отрицательное число), порядок равен 126, мантисса - 11 (в двоичной системе счисления). Значение этого числа равно: 1.11 * 2(126-127) = -1.75 * 2-1 = -0,875 Рассмотрим теперь различные особые случаи представления вещественных чисел.
Для большей наглядности сведем все возможные представления вещественных чисел в таблицу: Положительный нуль --T---------T------------------¬ ¦0¦ 0...0 ¦ 0...0 ¦ L-+---------+------------------- Отрицательный нуль --T---------T------------------¬ ¦1¦ 0...0 ¦ 0...0 ¦ L-+---------+------------------- Наименьшее положительное число --T---------T------------------¬ ¦0¦ 0...01 ¦ 0...0 ¦ L-+---------+------------------- Наибольшее отрицательное число --T---------T------------------¬ ¦1¦ 0...01 ¦ 0...0 ¦ L-+---------+------------------- Наибольшее положительное число --T---------T------------------¬ ¦0¦ 11...10 ¦ 1...1 ¦ L-+---------+------------------- Наименьшее отрицательное число --T---------T------------------¬ ¦1¦ 11...10 ¦ 1...1 ¦ L-+---------+------------------- Положительная бесконечность --T---------T------------------¬ ¦0¦ 1...1 ¦ 0...0 ¦ L-+---------+------------------- Отрицательная бесконечность --T---------T------------------¬ ¦1¦ 1...1 ¦ 0...0 ¦ L-+---------+------------------- Нечисло --T---------T------------------¬ ¦1¦ 1...1 ¦ х...х ¦ L-+---------+------------------- Неопределенность --T---------T------------------¬ ¦1¦ 1...1 ¦ 10...0 ¦ L-+---------+------------------- |