Команда FNOP. 10.9 Примеры решения типовых вычислительных задач. Вычисление интеграла функции. Вычисление суммы степенного ряда
Команда FNOP Команда FNOP для сопроцессора аналогична команде NOP для центрального процессора – она не выполняет никаких действий и может использоваться для отладки программ, написанных с использованием сопроцессора.
10. 9 Примеры решения типовых вычислительных задач
Вычисление интеграла функции В качестве первого примера рассмотрим приближенное вычисление интеграла от функции Sin(x) методом Симпсона по трем точкам на отрезке от p/3 до 3p/4. Интеграл вычисляется по следующей формуле:
,
где a и b – границы отрезка (в данном случае a = p/3, b = 3p/4), h – шаг (расстояние между узлами интегрирования: h = (b – a) / 2 = 5p/24. Для вычисления интеграла сначала нужно составить таблицу значений функции Sin(x) для точек a, b и (a + 2) / 2:
Эти значения используются в программе для вычисления значения интеграла. Результат вычисления значения интеграла заносится в регистр ST(0). Далее представлен текст программы: CODE SEGMENT ; сегмент команд ASSUME CS: CODE, DS: DATA, SS: STAC Start: MOV AX, DATA; настройка DS MOV DS, AX ; на сегмент данных FINIT ; инициализация сопроцессора FLD n4 ; загрузка в стек числа 4. 0 ; умножение на значение функции в точке (a + b) / 2 FMUL Sin[8] ; прибавление значения функции в точке a FADD Sin[0] ; прибавление значения функции в точке b FADD Sin[16] FDIV n3 ; деление на число 3. 0 FLD B ; вычисление FSUB A ; значения FDIV n2 ; шага h ; умножение шага на полученное значение FMUL ST, ST(1) MOV AX, 4C00H; функция завершения программы
INT 21H ; вызов DOS CODE ENDS
DATA SEGMENT ; сегмент данных ; определение границ отрезка интегрирования A DQ 1. 04719755119659774615421446109317 B DQ 2. 35619449019234492884698253745963 ; определение промежуточных чисел n2 DD 2. 0 n3 DD 3. 0 n4 DD 4. 0 ; определение таблицы значений функции Sin Sin DQ 0. 866025403784438646763723170752936 DQ 0. 991444861373810411144557526928563 DQ 0. 707106781186547524400844362104849 DATA ENDS
STAC SEGMENT PARA STACK; сегмент стека DB 128 DUP (? ); область памяти под стек STAC ENDS
END Start ; точка входа
Для обращения к элементам таблицы значений функции используются смещения 8 (для второго элемента) и 16 (для третьего элемента), поскольку размер элемента таблицы – 8 байт.
Вычисление суммы степенного ряда В качестве второго примера будет рассмотрена программа вычисления суммы степенного ряда для функции ex. Степенной ряд для функции ex записывается в виде:
При вычислении значения функции ex будет использоваться машинная точность, т. е. максимально возможная точность для выбранного формата представления действительных чисел. В примере используется формат с расширенной точностью. Переменная X содержится в сегменте данных программы и имеет двойную точность (8 байт). Программа завершает работу, когда достигнут машинный нуль, т. е. когда при добавлении очередного слагаемого к сумме степенного ряда значение этой суммы не изменяется. В этом случае вычисленное значение функции имеет машинную точность. Далее представлен текст программы. CODE SEGMENT ; сегмент команд ASSUME CS: CODE, DS: DATA, SS: STAC Start: MOV AX, DATA; настройка DS MOV DS, AX ; на сегмент данных FINIT ; инициализация сопроцессора FLD1 ; загрузка 1. 0 в стек FLD1 ; ---//--- FLD1 ; ---//--- FLD1 ; ---//---
FLD X ; загрузка переменной X в стек ; добавление к сумме ряда очередного слагаемого M1: FADD ST(1), ST FXCH ST(2) ; обмен ST(0) и ST(2) ; сравнение значений предыдущей и текущей суммы FCOM ; загрузка регистра состояния в переменную SW FSTSW SW AND SW, 4500H; наложение маски CMP SW, 4000H; проверка на установку флага C3 JE M2 ; переход, если достигнут машинный нуль FXCH ST(2) ; обмен ST(0) и ST(2) FADD ST(2), ST; получение предыдущей суммы ряда FMUL X ; умножение предыдущего слагаемого на X FXCH ST(3) ; обмен ST(0) и ST(3) FLD1 ; загрузка 1. 0 в стек FADDP ST(1), ST; увеличение аргумента факториала FXCH ST(3) ; обмен ST(0) и ST(3) FDIV ST, ST(3); деление предыдущего слагаемого на арг. факториала JMP M1 ; следующая итерация вычислений M2: MOV AX, 4C00H ; функция завершения программы INT 21H ; вызов DOS CODE ENDS
DATA SEGMENT ; сегмент данных X DQ 1. 0 ; аргумент функции ex SW DW? ; переменная для хранения регистра состояния DATA ENDS
STAC SEGMENT PARA STACK; сегмент стека DB 128 DUP (? ); область памяти под стек STAC ENDS
END Start ; точка входа
Значение следующего слагаемого вычисляется из значения предыдущего слагаемого следующим образом. Предыдущее слагаемое умножается на значение переменной X и делится на аргумент факториала для последующего слагаемого. Аргумент факториала для последующего слагаемого вычисляется путем добавления единицы к аргументу факториала предыдущего слагаемого. После вычисления значения очередного слагаемого оно добавляется к результату. Затем сравниваются значения предыдущего и текущего значений суммы ряда. Если они равны, значит достигнут машинный нуль и программа завершает работу, при этом результат находится в регистре ST(0). Если они не равны, то вычисления продолжаются дальше. В качестве начального слагаемого в стек заносится две единицы – для предыдущего и текущего значений суммы ряда. Еще две единицы заносятся в стек для начального аргумента факториала и для значения, на которое увеличивается аргумент факториала. Для получения значений флагов условий используется команда FSTSW и маска 4500H, выделяющая значения необходимых бит. При равенстве сравниваемых операндов флаг C3 должен быть установлен, а флаги C2 и C0 – сброшены. Это соответствует значению 4000H после наложения маски на значение регистра состояния сопроцессора.
Воспользуйтесь поиском по сайту: ©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...
|