Примеры решения типовых вычислительных задач
Примеры решения типовых вычислительных задач Вычисление интеграла функции В качестве первого примера рассмотрим приближенное вычисление интеграла от функции 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 FMUL Sin[8] ; умножение на значение функции в точке (a + b) / 2
FADD Sin[0] ; прибавление значения функции в точке a
FADD Sin[16] ; прибавление значения функции в точке b
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 ; сравнение значений предыдущей и текущей суммы
FSTSW SW ; загрузка регистра состояния в переменную 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 Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...
|