Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
29-32.doc
Скачиваний:
6
Добавлен:
23.04.2019
Размер:
220.67 Кб
Скачать

Вычисление некоторых элементарных функций с помощью сопроцессора.

Арифметический сопроцессор (FPU) предназначен для выполнения операций над числами в формате с плавающей точкой (вещественные числа) и длинными целыми числами. Он значительно (в десятки раз) ускоряет вычисления, связанные с вещественными числами. Сопроцессор может выполнять как простые арифметические операции (сложение, вычитание, умножение, деление и т.п.), так и вычислять значения различных функций (синус, косинус, тангенс, логарифмы и т. п.)

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

Принципы работы

Математический сопроцессор запускается центральным процессором. После запуска он выполняет все вычисления самостоятельно и параллельно с работой центрального процессора. Если центральный процессор направляет очередную команду сопроцессору в тот момент, когда сопроцессором еще не закончена предыдущая команда, центральный процессор переводится в состояние ожидания. Если же сопроцессор ничем не занят, центральный процессор, направив команду сопроцессору, продолжает свою работу, не дожидаясь завершения вычисления. Следовательно, всегда необходимо помнить, что вычисления, производимые математическим сопроцессором, выполняются параллельно с работой центрального процессора. Иногда последовательное расположение команд сопроцессора и центрального процессора в листинге программы создают иллюзию последовательного их выполнения. Проще говоря, возможна такая ситуация, что когда центральный процессор обратиться к ячейке памяти, куда арифметический сопроцессор должен был записать результат своих вычислений, то результата в ячейке может и не быть (точнее, содержимое ячейки памяти может быть произвольным). Все дело тут в том, что сопроцессор еще не закончил вычислений. Впрочем, есть специальные средства синхронизации (команда FWAIT).

Префикс команд и адресация операндов

Команды, предназначенные для выполнения сопроцессором, записываются в программе как обычные машинные команды центрального процессора. Но все они начинаются с байта, соответствующего команде центрального процессора ESC. Встретив такую команду, процессор передает ее сопроцессору, а сам продолжает выполнение программы со следующей команды.

Ассемблерные мнемоники всех команд сопроцессора начинаются с буквы F, например: FADD, FDIV, FSUB и так далее. Команды сопроцессора могут адресоваться к операндам, аналогично обычным командам центрального процессора. Операндами могут быть либо данные, расположенные в основной памяти компьютера, либо внутренние регистры сопроцессора.

Для команд арифметического сопроцессора возможны все виды адресации данных, используемые центральным процессором.

Форматы данных

Математический сопроцессор может обрабатывать данные в формате с плавающей точкой (вещественные числа) или целые числа.

Вещественные числа

В общем виде вещественные числа в обычных расчетах можно записать следующим образом:

(знак)(мантисса)*10(знак)(порядок)

Например: -1.35*10^5 (минус одна целая тридцать пять сотых, умноженные на десять в пятой степени).

Здесь знак - это минус, мантисса - 1.35, порядок - 5. Порядок тоже может иметь знак.

Важным является такое понятие, как нормализованное представление чисел:

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

123.5678*10^5 = 12.35678*10^6 = 1.235678*10^7 = 0.1235678*10^8

В языках программирования высокого уровня встречается следующее представление чисел с плавающей точкой:

(знак)(мантисса)E(знак)(порядок)

Например, -5.35E-2 означает число -5.35*10^-2 (минус пять целых тридцать пять сотых, умноженные на десять в минус второй степени) . Такое представление называется научной нотацией.

Арифметический сопроцессор может работать с вещественными числами в трех форматах:

  • одинарной точности (4 байт)

  • двойной точности (8 байт)

  • расширенной точности (10 байт)

В любом представлении старший бит определяет знак вещественного числа: 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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]