7.7.5. Степенные и тригонометрические функции

Оставшаяся группа команд сопроцессора 8087 выполняет вычисления сложных математических функций. Эти команды позволяют микросхеме 8087 вычислять арифметические выражения, требующие логарифмов, экспонент и тригонометрических функций. На Фиг. 7.22 изображен список этих команд. В этом списке нет тех операций, которые есть у карманного калькулятора. Конструкторы процессора 8087 не смогли реализовать все нужные функции на одном кристале, так как это оказалось слишком сложным. Вместо этого они создали набор функций более низкого уровня, из которых можно программно построить функции калькулятора. Например, таких тригонометрических функций как синус


Microsoft (R) Macro Assembler Version 5.00                  1/1/80 04:03:56
Фиг. 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 не выполняет. Эта команда за один раз уменьшает содержимое вершины стека максимум на 2^64. Команда выполняет нахождение истинного остатка и требует очень много времени для уменьшения большого числа по очень маленькому основанию. Максимально уменьшая число в течение каждого выполнения команды, программист может разрешить прерывания в течение всей операции поиска остатка. Если функция не завершена, команда 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