Команды трансцендентных функций
Более того, используя значения х и у, можно получить значения остальных три- гонометрических функций. Для этого используются следующие соотношения: |
Теперь вам, наверное, понятен термин «частичный» тангенс. К счастью, в про- цессоре 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 |
| ||||||||||
| ||||||||||
| ||||||||||
| ||||||||||
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 |
| ||||
® если С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 каталога данной главы. Программа преобразует содер- жимое вершины стека в символьный вид и выводит его на экран. В этом примере иллюстрируется работа многих уже рассмотренных команд.
Еще по теме Команды трансцендентных функций:
- Трансцендентность
- Трансцендентность (духовность)
- Функции журналистики. Понятие функцию Многообразие социальных и информационных потребностей общества – объективная основа функций журналистики.
- Определение команды.
- § 4.5. Деятельность команд в организации
- Признаки команды.
- Пример настройки и реабилитации в футбольной команде
- “Не язык — функция поэта, а поэт — функция языка”
- Работа с другими командами
- Четыре шага по созданию эффективной команды
- Кто становится лидером команды
- ШЕСТЬ СТУПЕНЕЙ НА ПУТИ СОЗДАНИЯ КОМАНДЫ.
- Создание деловой команды «Вероятно, я не лучший советчик в этом вопросе».
- Эд САЛЛИВАН. ВРЕМЯ — ДЕНЬГИ Создание команды разработчиков, программного обеспечения, 2001