Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Программирование блока FPU в IA

.pdf
Скачиваний:
45
Добавлен:
16.04.2013
Размер:
640.87 Кб
Скачать

Кроме рассмотренного способа тригонометрические функции могут вычисляться либо через тангенс половинного угла по формуле (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 = 1z2 ;

arccos z = 2arctg 1 z 2 = 2arctg (Y / X ),

Y = 1z,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, что потом компенсируется корректирующей добавкой к порядку.