
Программирование блока FPU в IA
.pdf
Кроме рассмотренного способа тригонометрические функции могут вычисляться либо через тангенс половинного угла по формуле (3), либо через тангенс полного угла по формулам:
sinx = tgx |
; |
cosx = |
1 |
; |
ctg x = 1 / tg x; |
(7) |
1+tg2x |
|
|
1+tg2x |
|
|
|
Однако эти формулы усложняют программу в части сведения углов и восстановления результатов по сравнению с формулами, использующими тангенс половинного угла.
Команда FPATAN вычисляет arctg(st[1]/st[0])=arctg(Y/X). Два верхних элемента извлекаются из стека, а результат включается в стек. Операнды этой команды должны удовлетворять условию 0<Y<Х, иначе необходимо использовать формулы приведения:
arctg х = -arctg(-х), arctg х = π/2 - arctg (1/ x ). (8)
Остальные обратные тригонометрические функции находятся с помощью команд FPATAN, FSQRT и таких формул:
arcsin z = arctg |
z |
= arctg (Y / X ), |
|
1 − z 2 |
|
Y =z, X = 1−z2 ;
arccos z = 2arctg 1 − z 2 = 2arctg (Y / X ),
Y = 1−z,X =
1+x;
arctg z = arctg (Y/X); arcctg z = arctg(1/z) = arctg(X/Y);
arccos ec ( z ) = sign ( z ) |
= arctg (Y / X ), |
z 2 −1 |
|
Y = sign(z); X = z2 −1;
arc sec z = 2arctg z 2 −1 = 2arctg (Y / X ),
Y = z 2 −1, X =1;

В этих формулах z - аргумент вычисляемой функции, X, Y - значения составного аргумента в регистрах st[0], st[1] перед выполнением команды FPATAN, результат которой помещается в вершину стека.
Формулы для вычисления логарифмических функций: log2x => FYL2X при Y => FLD1, X => FLD х; ln(x) => FYL2X при Y => FLDLN2, X => FLD x; lg(x) => FYL2X при Y => FLDLG2, X => FLD x.
Команда FYL2X вычисляет st(1)*log2(st[0]) при st[0]>0. Оба операнда извлекаются из стека, а затем результат помещается в стек. Команды FLDL2E, FLDL2T загружают константы со значением двоичных логарифмов числа e и числа 10.
Еще одна логарифмическая команда FYL2XP1 вычисляет st[1](st[0]+1) при st[0]<1-1/√2 и используется для вычисления обратных гиперболических функций. Команда F2XM1 вычисляет 2st[0]-1, причем для аргумента должно выполняться условие: |st[0]|≤1
Формулы для вычисления обратных гиперболических функций ориентированы на использование команд вычисления логарифмов, квадратного корня и загрузки констант:
z =| x | + |
| x |
| |
; |
|
|
|
|
1/ | x | + 1 + (1/ x)2 |
|
|
|
|
|||
|
|
|
|
|
|
||
arsh х = sign x *ln 2* log2(1 + z ), где |
z =| x | + |
| x | |
|
; |
|||
1+(1/ x) |
2 |
||||||
|
|
|
|
1/ | x | + |
|
|
|
arch x = ln2*log2(1+z), |
где z = x-1+ x 2 |
−1 и х>1; |
|
|
|
arth x = sign x - ln2 * log2(1+z), где z = 2|x| / (1-| x |) и -1< x< 1.
Для интервалов вне допустимых значений аргументов используются формулы приведения для обратных величин аргументов:
arcth x =arth (1/x); arcsh x =arsh (1/x); arsch x =arch (1/х).
Вычисление гиперболических и показательных функций организуется с использованием команды F2XM1 на основе вычисления промежуточных значений частичных экспоненциальных функций.
sh(x) = sign(x) |
e|x| −1/ e|x| |
; |
ch(x) = 0.5(e|x| + 1/e|x|); |
|||
|
|
|||||
|
|
2 |
|
|
|
|
tg(x) = sign(x) |
e2|x| −1 |
; |
cth(x) = 1/th(x); csh(x) = 1/sh(x); |
|||
|
|
|||||
e2|x| +1 |
||||||
|
|
|
|
sch(x) = 1/ch(x);
Формулы для вычисления показательных функций:
2x = (2x-1) + 1 |
=> F2XM1(x) + 1; |
ex = 1 + 2x log2(e)-1 |
=> 1+F2XM1(x*FLD2E); |
10x = 1 + 2x log2(10)-1 |
=> 1+F2XM1(x*FLD2T); |
xy = 1 + 2y log2(x)-1 |
=> 1+F2XM1(FYL2X(y,x)). |
Например, последнюю функцию можно реализовать следующей последовательностью команд:
FLD1 |
x |
; Загрузка единицы |
FLD |
; Загрузка основания |
|
FLD |
y |
; Загрузка показателя |
FYL2X |
|
; Вычисление логарифма результата |
FXTRACT |
; Расщепление на порядок и мантиссу |
|
FXCH |
st[1] |
; Сохранение порядка показателя |
FISTP |
tem |
|
; В должно |
быть выделено целочисленное поле tmp |
|
FIDIV qrt |
; Сведение диапазона делением на 4 |
|
; Поле qrt |
должно содержать целую константу 4 |
|
F2XM1 |
|
; Вычисление показательной функции |
FADD |
CX,2 |
; Коррекция эксп-ты от мантиссы на 1 |
MOV |
; Корректирующая добавка к порядку |
|
ADD |
CX,tem |
; Определение числа возведений в квадрат |
m1:FMUL st,st[0] ; Циклическое повторение |
||
LOOP |
m1 |
; возведений в квадрат |
К сожалению нельзя после команды FYL2X просто поставить F2XM1 с FADD и на этом завершить процедуру. Дело в том, что аргумент команды F2XM1 должен быть по модулю меньше 1. Поэтому приходится применять эту команду только к мантиссе результата, а порядок учитывать через процедуру циклического возведения в квадрат. Для гарантии, упомянутая мантисса результата, заранее делится на 4, что потом компенсируется корректирующей добавкой к порядку.