Оставшаяся группа команд сопроцессора 8087 выполняет вычисления
сложных математических функций. Эти команды позволяют микросхеме
8087 вычислять арифметические выражения, требующие логарифмов,
экспонент и тригонометрических функций. На Фиг. 7.22 изображен
список этих команд. В этом списке нет тех операций, которые есть у
карманного калькулятора. Конструкторы процессора 8087 не смогли
реализовать все нужные функции на одном кристале, так как это
оказалось слишком сложным. Вместо этого они создали набор функций
более низкого уровня, из которых можно программно построить функции
калькулятора. Например, таких тригонометрических функций как синус
Microsoft (R) Macro Assembler Version 5.00 1/1/80 04:04:28
Фиг. 7.22 Арифметические команды над вершиной стека 8087 Page 1-1
PAGE ,132
TITLE Фиг. 7.22 Арифметические команды над вершиной стека 8087
0000 CODE SEGMENT
ASSUME CS:CODE,DS:CODE
0000 9B D9 FA FSQRT
0003 9B D9 FD FSCALE
0006 9B D9 F8 FPREM
0009 9B D9 FC FRNDINT
000C 9B D9 F4 FXTRACT
000F 9B D9 E1 FABS
0012 9B D9 E0 FCHS
0015 9B D9 F2 FPTAN
0018 9B D9 F3 FPATAN
001B 9B D9 F0 F2XM1
001E 9B D9 F1 FYL2X
0021 9B D9 F9 FYL2XP1
0024 CODE ENDS
END
Фиг. 7.22 Арифметические команды над вершиной стека 8087
и косинус нет; вместо этих функций есть функция частичного
тангенса. Эта функция вычисляет отношение, равное тангенсу угла.
Из этого отношения программа может определить синус, косинус,
тангенс и любую другую тригонометрическую функцию. Из обратных
тригонометрических функций есть операция частичного арктангенса,
которая берет значения отношения чисел и вычисляет угол этого
тангенса. Эта частичная функция позволяет сконструировать
арксинус, арккосинус и другие функции, не имея их в явном виде.
Ниже приведен список команд этой группы с коротким комментарием
работы каждой команды. Ни у одной из этих команд не пишутся
операнды, так как все они работают с вершиной стека, и возможно,
также с элементом ST1.
FSQRT (квадратный корень)
ST квадратный корень из (ST)
ST должно быть неотрицательно.
FSCALE (масштабирование) ST <- ST * 2ST1
Эта команда необходима для возведения в степень. Другая, и
притом единственная, функция возведения в степень имеет ограничения
на значение показателя. Эта команда возводит 2 в степень, равную
целому числу. Далее будет приведен пример возведения 10 в
произвольную степень.
FPREM (частичный остаток)
ST <- ST mod ST1 (частичный)
Полностью операцию деления по заданному модулю команда FPREM не
выполняет. Эта команда за один раз уменьшает содержимое вершины
стека максимум на 264. Команда выполняет нахождение истинного
остатка и требует очень много времени для уменьшения большого числа
по очень маленькому основанию. Максимально уменьшая число в
течение каждого выполнения команды, программист может разрешить
прерывания в течение всей операции поиска остатка. Если функция не
завершена, команда FPREM устанавливает флаг C2 равным 1, а когда
завершает вычисление остатка, то устанавливает другие три флага C3,
C1 и C0 равными трем младшим битам частного. Когда команда FPREM
используется в тригонометрических примитивах для ограничения
величины угла, это оказывается необходимым для определения октанта
первоначального угла. Чтобы продемонстрировать работу этой
команды, мы далее приведем пример тригонометрических вычислений.
FRNDIN T (округление до целого)
ST <- Integer(ST)
Эта команда округляет текущее содержимое вершины стека до
целого числа. Текущее управляющее слово определяет направление
округления.
FXTRACT (извлечение)
ST <- дробная часть ST
ST1 показатель степени двойки ST
Эта команда разбивает текущую вершину стека на компоненты.
Аргументом этой функции является вершина стека. Значение
показателя степени замещает содержимое вершины стека, а затем
дробная часть аргумента помещается в стек и становится новой
вершиной стека. Действия этой команды FXTRACT обратны действиям
команды FSCALE. Если в вершине стека находится некоторое число, то
выполнение последовательно команд FXTRACT и FSCALE оставляет в
вершине стека то же число. Но команда FSCALE не удаляет из стека
показатель степени, так что теперь в стеке дополнительно окажется
еще одно число.
FABS (абсолютная величина)
ST <- абсолютное значение ST
Эта команда устанавливает у числа в вершине стека знаковый
разряю в нуль (что соответствует положительному значению).
FCHS (смена знака)
ST <- -ST
Эта команда изменяет знак у вершины стека.
Следующие команды выполняют также трансцендентные функции, как
тригонометрические, а также логарифмические и возведение в степень.
FPTAN (частичный тангенс)
ST <- X
ST1 <- Y, где Y/X = TAN(угол)
Эта команда позволяет вычислить все тригонометрические функции.
Исходное число - угол, выраженный в радианах, значение которого
должно быть в интервале 0 < угол < PI/4, - помещается в вершину
стека. Уменьшить угол до правильного значения можно с помощью
команды FPREM. Результатом является отношение Y/X, которое равно
тангенсу угла; Y замещает вершину стека, а затем в стек помещается
X. Другие тригонометрические функции можно вычислить с
использованием этих значений; например, косинус COS(угол) =
X/SQRT(X2 + Y2).
FPATAN (частичный арктангенс)
ST <- Arctan(Y/X) = Arctan(ST1/ST)
Эта функция дополняет предыдущую, FPTAN. Команда FPATAN
вычисляет угол в соответствии с отношением чисел ST1 и ST0. Она
извлекает из стека число X, а затем записывает результирующий угол
вместо числа Y в качестве новой вершины стека. Исходные значения
должны подчиняться неравенству
0 < Y < X < бесконечность
F2XM1 (два в степени X минус 1)
ST <- 2ST - 1
Эта функция выполняет возведение в степень; она возводит 2 в
степень, указанную в вершине стека. Исходное число должно
находиться в диапазоне 0 <= ST <=0.5, и чтобы вычислить два в
степени, большей 0.5, эту команду нужно использовать вместе с
командой FSCALF. С помощью команд FLD, загружающих специальные
константы, программа может возвести в заданную степень также числа,
отличные от 2, для этого используются следующие формулы:
10**X = 2**(X*Log2(10))
e**X = 2**(X*Log2(e))
Y**X = 2**(X*Log2(Y))
Далее приводится пример возведения 10 в произвольную степень.
FYL2X (Y умножить на логарифм по основанию 2 от X)
ST <- Y*Log2(X) = ST1*Log2(ST)
Эта функция выполняет операцию логарифмирования. Она берет
логарифм по основанию 2 от содержимого вершины стека и затем
умножает его на элемент ST1. Команда FYL2X извлекает из стека
число X и замещает результат числом Y. Исходные числа должны
удовлетворять следующим соотношениям:
0 < X < бесконечности и - бесконечность < Y < бесконечности.
Эта функция позволяет вычислять логарифмы и по основаниям, отличным
от 2. Следующая формула:
Logn(2) * Log2(X)
вычисляет логарифм числа X по основанию n; значение Logn2
вычисляется как 1/(Log2n).
FYL2XP1 (Y умножить на логарифм по основанию 2 от X+1)
ST <- Y*Log2(X+1) = ST1*Log2(ST+1)
Эта функция идентична функции FYL2X за исключением того, что к
X прибавляется 1. Функция FYL2XP1 накладывает более жесткие
ограничения на X, и предназначена для вычисления логарифмов чисел,
значения которых очень близки к 1. Эта функция дает наиболее
высокую точность, если
0 < ABS(X) < 1 - (корень из 2 )/2