Электронная библиотека книг Александра Фролова и Григория Фролова.
 
Библиотека
Братьев
Фроловых
Электронная библиотека книг Александра Фролова и Григория Фролова.
Библиотека системного программиста
Программирование на JAVA
ПК. Шаг за шагом
Другие книги
Восстановление данных
Антивирусная защита
Статьи для
программистов
Пользователю компьютера

Аппаратное обеспечение 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--+-------------+-------------------------------------



В любом представлении старший бит "Зн" определяет знак вещественного числа:

  • 0 - положительное число;
  • 1 - отрицательное число.

Все равные по абсолютному значению положительные и отрицательные числа отличаются только этим битом. В остальном числа с разным знаком полностью симметричны. Для представления отрицательных чисел здесь не используется дополнительный код, как это сделано в центральном процессоре.

Арифметический сопроцессор работает с нормализованными числами, поэтому поле мантиссы содержит мантиссу нормализованного числа.

Так как здесь используется двоичное представление чисел, сформулируем определение нормализованного числа для двоичного представления:

  • если целая часть мантисса числа в двоичном представлении равна 1, то число с плавающей точкой называется нормализованным.

Так как для нормализованного двоичного числа целая часть всегда равна единице, то эту единицу можно не хранить. Именно так и поступили разработчики арифметического сопроцессора - в форматах одинарной и двойной точности целая часть мантиссы не хранится. Таким образом экономится один бит памяти.

Для наглядности представим мантиссу числа в следующей форме:

n.nnnnnnnnnn...n


Здесь символом n обозначается либо 0, либо 1. Нормализованные числа в самой левой позиции содержат 1, поэтому их можно изобразить еще и в таком виде:

1.nnnnnnnnnn...n


Представление с расширенной точностью используется сопроцессором для выполнения всех операций. И даже более - все операции с числами сопроцессор выполняет над числами только в формате с расширенной точностью. В этом формате хранится и "лишний" бит целой части нормализованного числа.

Основная причина использования для вычислений расширенной точности - предохранение программы от возможной потери точности вычислений, связанной с большими различиями в порядках чисел, участвующих в арифметических операциях.

Поле порядка - это степень числа 2, на которую умножается мантисса, плюс смещение, равное 127 для одинарной точности, 1023 - для двойной точности и 16383 - для расширенной точности.

Для того, чтобы определить абсолютное значение числа с плавающей точкой, можно воспользоваться следующими формулами:

  • одинарная точность: 1.(цифры мантиссы)*2(P-127)
  • двойная точность: 1.(цифры мантиссы)*2(P-1023)
  • расширенная точность: 1.(цифры мантиссы)*2(P-16383)

Знак числа, как мы уже говорили, определяется старшим битом.

Приведем конкретный пример. Пусть мы имеем число с одинарной точностью, которое в двоичном виде выглядит следующим образом:

1 01111110 11000000000000000000000


Для этого числа знаковый бит равен 1 (отрицательное число), порядок равен 126, мантисса - 11 (в двоичной системе счисления).

Значение этого числа равно:

1.11 * 2(126-127) = -1.75 * 2-1 = -0,875


Рассмотрим теперь различные особые случаи представления вещественных чисел.

  • Нуль - это такое число, у которого порядок и мантисса равны нулю. Нуль может иметь положительный или отрицательный знаки, которые игнорируются в операциях сравнения. Таким образом, имеется два нуля - положительный и отрицательный.
  • Наименьшее положительное число - это число, которое имеет нулевой знаковый бит, значение порядка, равное 1, и значение мантиссы, равное нулю. В зависимости от представления наименьшее положительное число имеет следующие значения: 1,17*10-38 (одинарная точность), 2.23*10-308 (двойная точность), 3.37*10-4932 (расширенная точность).
  • Наибольшее отрицательное число - полностью совпадает с наименьшим положительным числом, но имеет бит знака, установленный в 1.
  • Наибольшее положительное число -это число, которое имеет нулевой знаковый бит, поле порядка, в котором все биты кроме самого младшего, равны 1, и содержит единицы во всех разрядах мантиссы. В зависимости от представления наибольшее положительное число имеет следующие значения: 3.37*1038 (одинарная точность), 1.67*10308 (двойная точность), 1.2*104932 (расширенная точность).
  • Наименьшее отрицательное число - полностью совпадает с наибольшим положительным числом, но имеет бит знака, установленный в 1.
  • Положительная и отрицательная бесконечность - это число содержит все единицы в поле порядка и все нули в поле мантиссы. В зависимости от состояния знакового бита может быть положительная и отрицательная бесконечности. Бесконечность может получиться, например, как результат деления конечного числа на нуль.
  • Нечисло - содержит все единицы в поле порядка и любое значение в поле мантиссы. Нечисло может возникнуть в результате выполнения неправильной операции при замаскированных особых случаях (ошибкам при работе с сопроцессоре будет посвящен отдельный раздел этой главы).
  • Неопределенность - содержит в поле порядка все единицы, а в поле мантиссы - число 1000..0 (для одинарной и двойной точности) или 11000..0 (для расширенной точности, так как в этом формате хранится старший бит мантиссы).

Для большей наглядности сведем все возможные представления вещественных чисел в таблицу:

Положительный нуль      
--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-+---------+-------------------


[Назад] [Содеожание] [Дальше]


Создание интернет-магазинов: http://www.shop2you.ru/ © Александр Фролов, Григорий Фролов, 1991-2016