<<
>>

Команды трансцендентных функций

Сопроцессор имеет ряд команд, предназначенных для вычисления значений три- гонометрических функций, таких как синус, косинус, тангенс, арктангенс, а также значений логарифмических и показательных функций.
Наличие этих команд значи- тельно облегчает жи⅛нь программисту, вынужденному интенсивно заниматься разработкой вычислительных алгоритмов. Выигрыш налицо. Во-первых, отпадает необходимость самому разрабатывать соответствующие подпрограммы. Во-вторых, точность результатов| выполнения трансцендентных команд очень высока. Необходимо обратить внимание читателя на то, что значения аргументов в ко- мандах, вычисляющий результат тригонометрических функций, должны задаваться в радианах. В связи с ⅛этим приведем правило пересчета. Для нахождения радиан- ной меры угла по его) градусной мере необходимо число градусов умножить на я/180 (=0,017453), ч⅛сло минут - натt/(18О ∙ 60) (=0,000291), а число секунд - патi/(18О ∙ 60 ∙ 60) (=Ф,ООООО5) и найденные произведения сложить.
Далее перечислен⅛i команды трансцендентных функций. * FCOS — команда вычисляет косинус угла, находящийся в вершине стека сопро- цессора — регистрjг ST(0). Команда не имеет операндов. Результат возвращает- ся в регистр ST(0). * FSIN — команда вычисляет синус угла, находящийся в вершине стека сопроцес- сора — регистре st(о). Команда не имеет операндов. Результат возвращается в регистр ST(0). ; п$ FSIN COS — команд^ вычисляет синус и косинус угла, находящиеся в вершине стека сопроцессора — регистре ST(0). Команда не имеет операндов. Результат возвращается в регистрах ST(0) и SТ(1). При этом синус помещается в ST(0), а ко- синус — в SТ(1). ! FРТАN — команда в[ычисляет частичный тангенс угла, находящийся в вершине стека сопроцессора — регистре ST(0). Команда не имеет операндов. Результат возвращается в регистрах SТ(0) и SТ(1).
ш FPRATAN — команд^ вычисляет частичный арктангенс угла, находящийся в вер- шине стека сопроцессора — регистре ST(0). Команда не имеет операндов. Ре- зультат возвращается в регистрах ST(0) и SТ(1). Интересна истор⅛ команды FРТАN. В отличие от команд вычисления синуса и косинуса, появившихся только в системе команд сопроцессора iЗ87, команда FРТАN присутствовала еще ц системе команд сопроцессора 18087. Выполнение ее имело следующую особенность: результат команды возвращался в виде двух значений — в регистрах ST(0) и SГ( 1), но ни одно из них не являлось истинным значением тан- генса. Истинное значение получается лишь после выполнения операции деления SГ(О)/SТ(1). Таким образом, для получения тангенса требуется еще команда деле- ния. Зачем это нужнс синуса и косинуса по tg(z/2) = у/х.
Более того, используя значения х и у, можно получить значения остальных три- гонометрических функций. Для этого используются следующие соотношения:

Теперь вам, наверное, понятен термин «частичный» тангенс. К счастью, в про- цессоре iЗ87 появились самостоятельные команды для вычисления синуса и коси- нуса, вследствие чего отпала необходимость составлять соответствующие подпро- граммы. Что же до команды FPTAN, то она по-прежнему выдает два значения в регистрах ST(0) и ST(1). Но теперь уже значение в ST(1) всегда равно единице, а это означает, что в ST(0) находится истинное значение тангенса числа, находившегося в SТ(0) до выдачи команды FPTAN. Рассмотрим теперь подробней команду вычисления частичного арктангенса угла FPATAN. Если использовать введенные нами при рассмотрении команды FPTAN обо- значения, то для команды FPATAN действует следующее отношение:

Значения х и у размещаются в стеке следующим образом: х — в регистре ST(0), у — в регистре в ST(1).

Результат z возвращается в ST(0), причем перед этим выпол- няется выталкивание значений х и у из стека сопроцессора. Команда FPATAN широ- ко применяется для вычисления значений обратных тригонометрических функ- ций, таких как aгсsin, aгсcos, aгсctg, aгсcosec, aгсsec. Например, для вычисления функции aгсsin используется следующая формула:

Для вычисления этой формулы необходимо выполнить следующую последо- вательность шагов. 1. Если а является мерой угла в градусах, то выполнить ее преобразование в ради- анную меру по правилу, приведенному ранее. 2. Поместить в стек а в радианной мере. 3. Вычислить значение выражения VI - «2 и поместить его в стек. 4. Выполнить команду FPATAN с аргументами в регистрах ST(0) и ST(1). В ST(0) должно быть значение выражения VI - а2, в st(l) — а. В результате этих действий в регистре ST(0) будет сформировано значение вы- ражения аrсsiп(а). Аналогично вычисляются значения других обратных тригонометрических функ- ций. Для вычисления функции аrссоs(а) используется формула

Для ее вычислений необходимо выполнить следующую последовательность шагов: 1. Если а является мерой угла в градусах, то выполнить ее преобразование в ради- анную меру по правилу, приведенному ранее 2. Вычислить значение выражения Vl -а и поместить его в стек. 3. Вычислить значение выражения Vl + a и поместить его в стек. 4. Выполнить команд^ FРАТАN с аргументами в регистрах SТ(О) и SТ(1). В SГ(О) должно быть значение выражения Vl + a , в SТ(1) — Vl - а • В результате этих Действий в регистре SТ(О) сформируется значение выраже- ния агссоs(а). ! Для вычисления аijссtg(а) используется формула j аrссtg(а) = аrсtg( 1 /а). Для ее вычислений необходимо выполнить следующую последовательность шагов: | 1.

Если а является ме рой угла в градусах, то выполнить ее преобразование в ради- Выполнить команду FPATAN с аргументами в регистрах SТ(О) и SТ(1). В SТ(О) должно быть значение а, в Д(l) — 1. В результате этих действий в регистре SТ(О) сформируется значение выраже- нияаrссtg(а). I Если вам понадоби|тся вычислить значения других тригонометрических функ- ций, то ход ваших рассуждений должен быть аналогичен приведенному выше. Зная набор функций, поддерживаемых сопроцессором, вам следует искать формулы приведения (или выводить их самим), выражающие нереализованные в сопроцес- соре функции посредс твом реализованных. Не забывайте контролировать диапа- зоны значений аргументов для тех команд, которые требуют этого. Для демонстрации jприменения команд данной группы реализуем два алгорит- ма построения графических изображений на основе определенных математических зависимостей. Реализфцией этих примеров мы завершим разработку Wiпdоws-при- ложения, о котором рассказывалось в главе 16. Если вы помните, это было прило- жение, в котором остались нереализованными два пункта меню: Графика ► Эффек- ты ► Павлин и Графика ► Эффекты ► Кружева. Рассмотрим вначале суть алгоритмов, в соответствии с которыми строятся эти графические изображения. Математиче- ские зависимости для построения этих фигур взяты из [17]. Фигура «Павлин» ёостоит из множества отрезков. Один конец каждого из этих отрезков располагается вдоль горизонтальной линии. Расположение второго кон- ца рассчитывается по фпределенным формулам, содержащим тригонометрические функции sin и cos. Последовательность шагов построения фигуры «Павлин» вы- глядит следующим образом. 1. Организуется цикл по переменной xl (координата первого конца каждого от- резка), которая изменяется от 0 до значения icycl. 2. Для текущего значения xl вычисляются значения координат другого конца от- резка (х2, у2) по формулам х2 = il2О + ilOO • sin(xl/i30); у2 = 190 + ilOO ∙ соs(хl/iЗО). 3. Строится отрезок, координаты концов которого располагаются в точках (xl, icenter) и (х2, у2). 4. Если значение xl не превысило значения icycl, то цикл повторяется для xl, уве- личенного на 1. В этом алгоритме значения icenter, icycl, і'9О, ilOO, Ϊ120, i30 представляют собой константы, изменяя которые/вы будете получать на экране другие варианты гра- фического изображения «Павлин». На рис. 17.18 показан результат работы этого алгоритма.
Рис. 17.18. Результат работы приложения (пункт меню Графика ► Эффекты ► Павлин)

Несущественные детали алгоритма вы легко восстановите по фрагменту про- граммы, приведенному в листинге 17.9. Полный текст программы приведен в ка- талоге данной главы среди файлов, прилагаемых к книге[17]. Листинг 17.9. Фрагмент программы для воспроизведения фигуры «Павлин» .data определение констант для фигуры "Павлин" xl dd 1 х2 dd 0 у2 dd 0 ;............................ -IftепuРrос........................................................................ ;обработка сообщений!от меню MenuProc proc I @@idmреасосk: ;"Пафлин" ;очистим окно j ;выполним первичное заполнение растра серым цветом ;получим дескриптор серой кисти hbrush=GеtStосkОbjесt(GRАY_ВRUSН) push GRАY_ВRU$Н call GеtStосk(j)bjесt mоv @@hbrush еах ;выбираем кисть в контекст памяти SеlесtОbjесt(mеmdс, @@hbrush) push @@hbrush| push mеmdс ; call SеlесtОbjесt ;заполняем выбранной кистью виртуальное окно ;ВООL РаtВlt(НDС hdс[ iпt пХLеft, iпt пYLеft, iпt пWidth, iпt пНеight, DWORD dwRop) ! ' push PATCOPY i

push rаахY | push mахХ push NOLL push NULL push memdc call PatBlt i mov ecx, icycl push ecx ! @@ml: j finit

;вычислим x2=12θ+lθθfsin(xl/30) Листинг 17.9(продолжение) y2 x2 memdc LineTo сообщения WM_PAINT для вывода строки на экран 0 NDhh @@hwпd IпvаlidаtеRесt @@ml @@ехi t Фигура «Кружева» формируется следующим образом. В окне приложения стро- ятся вершины правильного многоугольника, количество которых задается констан- той N. Каждая из этих N вершин соединяется отрезками с другими вершинами. Координаты вершин многоугольника задаются формулами xi = хс + г • соs(2тт/N) • iсепtеr; yi = ус + r • sіп(2jс/N). Здесь i — номер вершины; г — радиус описанной около многоугольника окруж- ности; (хс, ус) — координаты центра многоугольника.

В этом алгоритме значения N, г, хс, ус представляют собой константы, изменяя которые, вы будете получать на экране другие варианты графического изображе- ния «Кружева». На рис. 17.19 показан результат работы программы. Несущественные детали алгоритма вы легко восстановите по фрагменту про- граммы, приведенному в листинге 17.10. Полный текст программы можно найти среди файлов, прилагаемых к книге, в каталоге данной главы.

; вычислим DТТ=2*рi/Nj finit i

. code
; - г-- :--- :---- :--- :|lеПUРrОС............................................... ;обработка сообщений! от меню MenuProc proc ; @@idmlасеs: ;"Кружев⅜" ;очистим окно i ;выполним первичное Заполнение растра серым цветом ;получим дескриптор t:ерой кисти hbrush=GеtStосkОbjесt(GRАY_ВRUSН) push GRАY_ВRUfiН call GеtStосkf)bj есt mov @@hbгushi еах ;выбираем кисть в контекст памяти SеlесtОbjесt(mеmdс, @@hbrush) push @@hbr u s h i push mеmdс j call SеlесtОb⅛есt заполняем выбранной!кистью виртуальное окно B00L РаtВlt(НDС hdсL iпt пХLеft, iпt пYLеft, iпt пWidth, iпt пНеight, 'DWORD dwRор)
push push push push push push call
PATCOPY maxY maxX NULL NULL memdc PatBlt

mаsХ[еsi *4] mаsХ[еsi *4], Xc

R masY[esi*4] eax, Yc eax, masY [esi *4] mаsY[еsi *4], eax i i, N @@m3

NULL esi, i masY[esi*4] mаsХ[еsi *4] memdc MoveToEx edi , j masY[edi *4] masX[edi *4] memdc Li neTo j. N

Листинг 17.10 (продолжение)

® если С2 = 1, то необходимо продолжить выполнение команды FPREM, так как раз- ность в SТ(О) больше значения модуля в SГ(1). Таким образом, необходимо анализировать флаг С2 в теле цикла. Для этого С2 записывается в регистр флагов основного процессора с последующим анализом его командами услови ого перехода. Другой способ заключается в сравнении SТ(0) и SГ(1). I Необходимость в таком частичном исполнении команды FPREM возникает из-за того, что если делимое слишком велико, а делитель мал, то время получения ко- нечного частичного остатка, удовлетворяющего условию SТ(О) < ЭТ(1), может быть достаточно большим. При этом становится невозможной своевременная реакция на поступающие запросы прерываний, возможно, достаточно важные для того, что- бы быть задержанными в обработке. В контексте рассмотрения нами трансцендендентных команд пример исполь- зования команды FPREM является наиболее показательным. При рассмотрении ко- манды FPTAN мы упомянули о том, что аргумент z функции tg должен находиться в диапазоне 0 < z < л/4. Исходя из того, что данная тригонометрическая функция является периодичесi< ой, возникает необходимость понижения размерности аргу- мента z, находящего^ за рамками указанного диапазона допустимых значений Для команды FPTAN, что и Делается с помощью команды FPREM. Важно отметить, Ято команда FPREM не соответствует последнему стандарту IEEE-754 на вычисления с плавающей точкой. По этой причине в систему команд сопроцессора iЗ87 быфа введена команда FPREM1, которая отличается от команды FPREM тем, что накладывается дополнительное требование на значение остатка в ЭТ(О). Это значение не должно превышать половины модуля в SГ(1). В остальном работа команды FPREM 1 аналогична работе FPREM. Команды FPREM и FPREM1 имеют еще одну особенность, представляющую инте- рес для команд, вычисляющих значения периодических тригонометрических функ- ций. После полного завершения работы команды FPREM/FPREM1 (когда С2 = 0) биты СО, СЗ, С1 содержатзначения трех младших битов частного, которые логически пред- ставляют собой численное значение номера одного из восьми октантов единично- го круга. Это, несомненно, важная информация при работе с тригонометрически- ми функциями. i Далее рассмотрим!еще TPИ трансцендентные команды. Команда F2XM1 — ⅛оманда вычисления значения функции у = 2 - 1. Исходное значение х размещается в вершине стека сопроцессора в регистре SТ(О) и должно лежать в диапазоне -1[ < х < 1. Результату замещаетх в регистре SТ(О). Эта команда может быть использована для вычисления различных показательных функций (например, далее показано, как она используется для возведения числа в степень). Единица вычитается для того, чтобы получить точный результат, когда значе- ние х близко к нулю! Вспомните, что нормализованное число всегда содержит в качестве первой значащей цифры единицу. Поэтому, если в результате вычисле- ния функции Гполу⅛ается число 1,000000000456..., то команда F2XM1, вычитая 1 из этого числа и зате⅛ нормализуя результат, формирует больше значащих цифр, то есть делает его бол⅛ точным. Неявное вычитание единицы командой F2XM1 ком- пенсируется командой FАDD с единичным операндом. Команда FYL2Х — команда вычисления значения функции 2 = у log2(x). Исход- ное значение х размещается в вершине стека сопроцессора, а исходное значение у — в регистре SГ(1). Значение х должно лежать в диапазоне 0 < х < +∞, а значение у — в диапазоне -∞ О производится специальной командой сопроцессора Рк'L2Х, рассмотренной ранее. Вычисление ΐ производится командой F2ХМ1 (лишнее вычитание единицы пока не замечаем, так как его всегда можно компенсировать сложением с единицей). Но в последнем действии есть тонкий момент, который связан с тем, что величина аргумента х долж- на лежать в диапазоне: -1 1, то представить г в виде двух слагаемых г\ +гZ, гдеzl — целое значение, a z2 — значение меньше единицы (например, число 16,84 следует представить в виде суммы 16 + 0,84); в программе это можно выпол- нить путем циклического вычитания единицы из начального значения г до тех пор, пока оно не станет меньше единицы (количество вычитаний нужно запомнить, обозначив через п). 5. Выполнить команду F2ХМ1 с аргументом z2. 6. Выполнить команды FLD1 и FАDD, компенсирующие единицу, которая была вы- чтена из результат^ функции 2Д на шаге 5 командой F2ХМ1. 7. Выполнить команду FSСАLЕ с аргументом zl. Переменную zl нужно инициали- зировать нулем, чjо позволит получить корректный результат, даже если ис- ходное значение z было меньше единицы. 8. Перемножить результаты, полученные на шагах 6 и 7, — в вершине стека ока- жется результат возведения в степень. Если показатель степени, проверяемый на шаге 2, был отрицательным, необходимо единицу разделить на этот резуль- тат. Для этого в ст(гк загружаем единицу командой FLD1 и применяем команду FDIV. j Данный алгоритм ^еадизует программа листинга 17.11.

Листинг 17.11. Возведение числа в произвольную степень Листинг 17.11 (продолжение) тl2: iпс сх f sub st (1) , st(О) f сот fstsw ах sаhf jр exit;операнды не сравнимы jz тl2 jпс rа2 ;если |z|l, то переход на ml2 m3: mоv рl, 1 jmр $+7 m2; mоv Рl. ecx fхсh f 2хml fаdd ;компенсируем 1 fild рl ;показатель степени для fsсаlе fldl fscale ' fхсh fiпсstр fmul . ;проверка на отрицательную степень cmp flag, 1 jnz exit fldl fxch fdiv exit: f mоv ах, 4с00h ! iпt 21h main endp end main . Используя тождество lоg,,(лг) - lо⅛(2) ∙ lо⅛(дг), можно вычислить логарифм любого числа по любому основанию. Значения lо⅛(2), lo⅞(10) и некоторых дру- гих логарифмических функций вычисляются соответствующими командами со- процессора: FLDL2Т, FLDL2Е, FLDLG2, FLDLN2. Еще одна команда FYL2XP1 — команда вычисления значения функции z = = ^г(i +1). Исходное значение х размещается в вершине стека сопроцессора — регистре SТ(О), а исходное значение у — в регистре SТ(1). Значение х должно лежать в диапазоне 0 < \х\< 1-l/V2 , а значение у — в диапазоне -∞ < у < +. Перед тем как записать результат г в вершину стека — регистр ST(0), команда FYL2XP1 вытал- кивает из стека значения х и у. Очень интересную программу можно найти среди файлов, прилагаемых к кни- ге, в подкаталоге ..\ОutFРU каталога данной главы. Программа преобразует содер- жимое вершины стека в символьный вид и выводит его на экран. В этом примере иллюстрируется работа многих уже рассмотренных команд.

<< | >>
Источник: В. И. Юров. Assembler. Учебник для вузов. 2-е изд. 2003

Еще по теме Команды трансцендентных функций:

  1. Трансцендентность
  2. Трансцендентность (духовность)
  3. Функции журналистики. Понятие функцию Многообразие социальных и информационных потребностей общества – объективная основа функций журналистики.
  4. Определение команды.
  5. § 4.5. Деятельность команд в организации
  6. Признаки команды.
  7. Пример настройки и реабилитации в футбольной команде
  8. “Не язык — функция поэта, а поэт — функция языка”
  9. Работа с другими командами
  10. Четыре шага по созданию эффективной команды
  11. Кто становится лидером команды
  12. ШЕСТЬ СТУПЕНЕЙ НА ПУТИ СОЗДАНИЯ КОМАНДЫ.
  13. Создание деловой команды «Вероятно, я не лучший советчик в этом вопросе».
  14. Эд САЛЛИВАН. ВРЕМЯ — ДЕНЬГИ Создание команды разработчиков, программного обеспечения, 2001