Додаткові арифметичні команди FPU. 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Додаткові арифметичні команди FPU.



Додаткові команди належать до арифметичних, мають безоперандну форму. Всіх команд – 8.

fsqrt – замінює вершину стека коренем квадратним з вмісту вершини стека. , . 1) Виконується порівняно швидко як і команда ділення. 2) Точність команди відповідає точності звичайних арифметичних операцій (похибка результату відповідає половині молодшого біта мантиси). 3) В команді доступні режими заокруглення.

Якщо , то виникає особлива ситуація “не дійсна операція”.

fscale – масштабування інтерпретує як ціле двійкове і додає його

fscale; - це команда швидкого множення ( або ділення вмісту вершини стека на цілий степінь двійки.
Обмежень на діапазон немає. Якщо не ціле число, fscale використовує найближче ціле, яке менше за величиною, тобто урізає до нуля. Зручно використовувати для масштабування набору чисел (завантаження, масштабування і збереження). Вміст без зміни.

fprem – обчислює часткову остачу від ділення числа в на і завантажує результат в st(0):

fprem; st(0)= (st(0)) – q*(st(1)), де q – ціле число. Тут вміст регістра st(1) є модулем в операції обчислення остачі. Знак остачі збігається зі знаком початкового діленого.

Опис команди:

EXPDIF=exponent(st(0)) – exponent(st(1));

if EXPDIF<64 then

q=ціле, яке одержується заокругленням (st(0)) (st(1)) до нуля;

st=(st) – (st(1))*q;

c2=0;

c0,c1,c3=три молодших біти q;(q2,q1,q0)

else

c2=1;

n=число між 32 і 63;

qq=ціле, яке одержується заокругленням (st(0)) (st(1)) до нуля;

st=(st) – ();

fi;

fprem працює методом ітераційного віднімання і може зменшити показник степеня в st не більше, ніж на 63 за одне своє виконання. Якщо в процесі виконання fprem одержується остача менша за модуль, то функція вважається виконаною і прапорець с2 встановлюється рівним 0. В противному випадку, прапорець с2 стає рівним 1, а результат в st називається неповною остачею. Програма може виконати команду ще раз і одержати повну (або нову неповну) остачу.

Перевірку біта с2 можна за допомогою цілочислового пристрою: передача sw в ax, потім командою sahf переслати вміст регістра ah в регістр eflags і стан прапорця с2 показує прапорець pf. Інший спосіб: порівняння st(0) і st(1). Повна остача отримана, якщо (st(0)) менший (st(1)).

fprem1 – як і команда fprem і обчислює остачу, яка одержується при діленні (st(0)) на (st(1)), причому величина повної остачі менша, ніж половина величини модуля.

Опис команди:

EXPDIF=exponent(st(0)) – exponent(st(1));

if EXPDIF<64 then

q=ціле, яке одержується заокругленням (st(0)) (st(1)); (*заокруглення до найближчого цілого або найближчого парного цілого, якщо результат точно посередині між двома числами*)

st=(st) – (st(1))*q;

c2=0;

c0,c1,c3=три молодших біти q;(q2,q1,q0)

else

c2=1;

n=число між 32 і 63;

qq=ціле, яке одержується заокругленням (st(0)) (st(1)) до нуля;

st=(st) – ();

fprem1 працює методом ітераційного віднімання і може зменшити показник степеня в st не більше, ніж на 63 за одне своє виконання. Якщо в процесі виконання fprem1 одержується остача менша за модуль, то функція вважається виконаною і прапорець с2 встановлюється рівним 0. В противному випадку, прапорець с2 стає рівним 1, а результат в st називається неповною остачею. Програма може виконати команду ще раз і одержати повну (або нову неповну) остачу.

Перевірку біта с2 можна за допомогою цілочислового пристрою: передача sw в ax, потім командою sahf переслати вміст регістра ah в регістр eflags і стан прапорця с2 показує прапорець pf. Інший спосіб: порівняння st(0) і st(1). Повна остача отримана, якщо (st(0)) менший (st(1)).

Команди fprem і fprem1 мають ще одну особливість, яку можна використати, застосовуючи команди обчислення тригонометричних функцій. Після повного завершення команди fprem і fprem1 (с2=0) біти с0, с3, с1 містять значення трьох молодших бітів частки, які логічно є числовими значеннями номера одного з восьми октантів одиничного круга. Це суттєво можна використати, працюючи з тригонометричними функціями.

frndint – команда заокруглення до цілого. Заокруглює число в st до цілого. Режим заокруглення задається в полі rc регістра cw.

fxtract – команда виділення компонентів числа з плаваючою крапкою. Компонентами такого числа є фактичний порядок і мантиса. Команда розщеплює (st) на порядок і мантису. Порядок перетворює в число з плаваючою крапкою в форматі РТ і записує його замість початкового числа. Мантиса як число в форматі РТ (знак збігається зі знаком початкового операнда, істинний порядок дорівнює 0, тобто зміщений порядок 16383=3fffh, мантиса дорівнює мантисі початкового операнда) записується в нову вершину стека. Якщо початковий операнд дорівнює нулеві, то команда fxtract утворює 0 в st(0), мінус безмежність в st(1) і фіксує особливий випадок “ділення на нуль”.

Команду можна використовувати разом з командою fbstp для перетворення чисел з формату РТ в десятковий формат при виведенні на дисплей або принтер. Відзначимо, що командою fscale розщеплене число можна перетворити в початкове.

Насамкінець ще дві команди:

fabs – st(0)= ;

fchs – st(0)= .


Команди порівняння FPU

Використовуються для аналізу чисел на вершині стека (іноді відносно другого числа) і формування коду умови в sw.

Команди дійсного порівняння: (st(0)) порівнюється з (src), а саме, з вмістом регістра, операндом в оперативній пам’яті (ОТ або ПТ). Якщо операнда немає, то порівнюються (st(0)) і (st(1)). В усіх командах порівняння знак нуля ігнорується, тобто і не розрізняються (рівні).

fcom // src – порівнює (st(0)) зі вмістом src. Код умови відображує відношення між числами операндами. Операнди вважаються не порівнюваними або не упорядкованими, якщо хоча б один з них є не числом.

zf pf cf

Умова с3 с2 с1 с0
     
     
     
     

 

Після запису с3с2с1с0 в регістр ( і ) для переходу за результатом порівняння можна використовувати команди умовного переходу (). Для перевірки операндів не чисел використати команду . Команда fcom сигналізує про особливий випадок “недійсна операція”, якщо хоча б один з операндів є “тихим” не числом.

fcomp // src – порівняння і вилучення зі стека. Операнд src – в ОП (ОТ або ПТ). Працює як і fcom, але додатково ще вилучає зі стека.

fcompp – порівняння (st(0)) і (st(1)) та подвійного вилучення зі стека. Якщо будь-який з операндів є не числом або має не підтримуваний формат, або якщо виникає порушення стека, то формується особливий випадок “недійсна операція” і код умови показує не порівнювані (не упорядковані).

ficom src – результат порівняння визначається в таблиці, наведеній вище. Операнд (src) – трактується як ціле число в форматі ЦС або КЦ, перетворюється у формат РТ і порівнюється з (st(0)).

ficomp src – команда виконує такі ж дії як ficom і додатково ще вилучає зі стека. Операнд (src) – трактується як ціле число в форматі ЦС або КЦ, перетворюється у формат РТ і порівнюється з (st(0)). ОВ як і в інших командах порівняння.

Три команди fucom/fucomp/fucompp – неупорядкованого дійсного порівняння. Вони порівнюють вершину стека з (src), який може бути тільки вмістом регістра st(i). Якщо без операнда, то st(1). Коди умови визначаються у вище наведеній таблиці. Якщо будь який операнд у цих командах порівняння є “тихе не число”, то команди не формують особливий випадок “недійсна операція”, хоча біти коду умови показують “неупорядковані”. Однак, якщо один з операндів є сигналізуючим не числом або поданий у не підтримуваному форматі, або виникає порушення стека, формується особливий випадок “недійсна операція”.

fucomp – додатково вилучає зі стека вершину.

fucompp – додатково вилучає зі стека вершину і підвершину.

ftst – (без операнда) порівнює (st(0)) з нулем і формує код умови як вказано вище в таблиці.

fxam – аналіз вмісту вершини стека, тобто (st(0)), і формування в коді умови с3с2с1с0 результату цього аналізу, а саме:

с1= знаковий біт (st(0))

case (тип об’єкта в st(0)) of

не підтримуваний формат: с3,с2,с0=0,0,0

не число: с3,с2,с0=0,0,1

нормалізоване число: с3,с2,с0=0,1,0

безмежність: с3,с2,с0=0,1,1

Нуль: с3,с2,с0=1,0,0

Порожній: с3,с2,с0=1,0,1

Денормалізоване число: с3,с2,с0=1,1,0

 


38. Команди трансцендентних функцій. Алгоритми обчислення значень функцій і та логарифмів за будь-якою основою.

Команда – обчислення часткового тангенса. Вона сприймає в число з діапазону від до , яке вважається аргументом в радіанах. Повертає результат у двох верхніх регістрах стека: значення тангенса заданого кута заміщує аргумент і в стек записується 1.0. Такі дії пояснюються сумісністю зі співпроцесорами 8087 і 80287, в яких команда дає тангенс, який дорівнює і значення в не дорівнює 1.0. Отже в цих співпроцесорах для одержання тангенса потрібна ще одна дія ділення (це й пояснює появу терміну “частковий тангенс”). Крім того запис у стек 1.0 спрощує обчислення інших тригонометричних функцій. Наприклад, котангенс можна обчислити, виконавши після команду ().

Якщо операнд не припустимий, біт с2 коду умови установлюється в 1 і залишається незмінним. Програмно потрібно операнд звести до значення, яке повинно знаходитися в діапазоні від до , віднімаючи відповідне число, кратне . Щоб не виникло особливого випадку “недійсна операція”, регістр повинен бути порожнім.

Команда – обчислення часткового арктангенса: обчислює . Після цього вилучення зі стека і кут заміщує два операнди у вершині стека. Результат має той же знак, що й операнд в і величину . Термін “частковий арктангенс” успадкований від процесорів 8087 і 80287, в яких були обмеження на значення в і . У 80387 і FPU обмежень на діапазон припустимих аргументів команди немає.

Те, що сприймає два аргументи і обчислює їх відношення, спрощує обчислення інших тригонометричних функцій. Наприклад,

, (38.1)

. (38.2)

Зрозуміло, що в обох цих співвідношеннях .

Покажемо, що формули (38.1) і (38.2) справджуються. Для доведення формули (38.1) застосуємо до обох частин цієї формули функцію

.

Знайдемо . Маємо

.

Оскільки

, то одержуємо

що . Одержана рівність підтверджує правильність співвідношення (38.1).

Для доведення (38.2) застосуємо до обох частин функцію

.

Одержана рівність завершує доведення формули (38.2).

Для обчислення за формулою (38.1) потрібно виконати наступні кроки.

1. Якщо є мірою кута в градусах, то потрібно виконати потрібні перетворення: число градусів помножити на , число мінут – на , число секунд – на і знайдені добутки додати.

2. Записати в стек.

3. Обчислити значення виразу і записати його в стек.

4. Виконати команду повинно бути значення виразу , а в .

Як результат цих дій в регістрі сформується значення виразу . Для виконання обчислень за формулою (38.2) потрібно виконати дії:

1. Якщо є мірою кута в градусах, то потрібно виконати потрібні перетворення: число градусів помножити на , число мінут – на , число секунд – на і знайдені добутки додати.

2. Обчислити значення виразу і записати його в стек.

3. Обчислити значення виразу і записати його в стек.

4. Виконати команду повинно бути значення виразу , а в ).

Як результат цих дій в регістрі сформується значення виразу .

Виконуючи команди і , процесор i486, слідкує за перериваннями. Він може відмінити виконання цих команд для обслуговування переривань. Обидві команди дуже точні і виконуються швидко (біля трьох разів повільніше, ніж команда ділення).

Новими для 80387 і FPU є команди: обчислення синуса , косинуса – , а також синуса косинуса – . Для цих команд - початковий кут в радіанах в діапазоні – від до . Якщо кут за межами діапазону, команди не виконуються, біт с2 установлюється в 1 і не змінюється. Забезпечити допустимий діапазон для початкового кута зобов’язаний програміст, віднімаючи відповідне кратне .

Команди і повертають результат на місці аргументу, а значення синуса на місці аргументу і значення косинуса записується в стек.

Команда використовується для обчислення виразу . Значення береться з і повинно бути з діапазону . Якщо операнд поза припустимим діапазоном, результат невизначений. Віднімання 1 пов’язано з точністю обчислень, коли значення близьке до 0. Результат записується в замість операнда .

Якщо потрібно обчислити значення виразу , то це можна зробити за формулою

. (38.3)

Вираз можна обчислити за допомогою команди , яка обчислює двійковий логарифм числа і множить на . Аргумент повинен бути в регістрі , а – в регістрі , – будь-яке додатне число, а – будь-яке. Команда обчислює логарифм числа з регістра , множить його на і повертає результат в , .

Якщо операнд в від’ємний, виникає особлива ситуація “недійсна операція”.

Отже, у виразі (38.3) легко обчислити показник степеня, тобто . Якщо , то далі легко обчислити , застосувавши команду . Однак, якщо не з даного діапазону, потрібно виконати додаткові обчислення за наступним алгоритмом:

1) спочатку запишемо в ;

2) застосуємо команду і одержимо в мантису числа у форматі числа РТ з характеристикою , а порядок числа в форматі числа РТ в регістрі ;

3) оскільки мантиса подана в нормалізованому вигляді, то вона за модулем більша або рівна 1. Тому для зведення мантиси до потрібного діапазону, якщо вона додатна, то від неї потрібно відняти 1 і до додати 1, а якщо вона від’ємна, то додати 1 і від відняти 1 (тепер , де – вміст регістра , а , де – істинний порядок ;

4) Застосуємо команду . В одержимо ;

5) Виконаємо команду ;

6) Виконаємо команду , в одержимо ;

7) Застосуємо тепер команду , в одержимо .

Для обчислення логарифма за будь-якою основою можна використати формулу

.

Команда – обчислює значення виразу: . Значення вибирається з , причому , значення з регістра і може набувати будь-яких значень . Результат на місці і . Команда забезпечує більшу точність для обчислення логарифмів чисел, близьких до 1. Якщо не з допустимого діапазону, то результат команди невизначений. Команди і можуть бути призупинені і відмінені в зв’язку з обробкою переривання.



Поделиться:


Последнее изменение этой страницы: 2017-01-27; просмотров: 324; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.145.93.221 (0.045 с.)