Главная | Обратная связь | Поможем написать вашу работу!
МегаЛекции

Команда 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:

 

Sin(p/3) 0, 866025403784438646763723170752936
Sin(13p/24) 0, 991444861373810411144557526928563
Sin(3p/4) 0, 707106781186547524400844362104849

Эти значения используются в программе для вычисления значения интеграла. Результат вычисления значения интеграла заносится в регистр 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 Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...