Консультация № 178862
05.06.2010, 02:31
0.00 руб.
0 5 1
Уважаемые эксперты! Помогите пожалуйста разработать программу на языке ASSEMBLER, вычисляющую значения функции F(x) в интервале [-10,12] при изменении переменной x шагом 2.



F(x) = a(x^2 + y^2 ) - b/(x^2 - y^2 ),

где a = -2.5; b = 0.563; y=4

Обсуждение

давно
Посетитель
7438
7205
05.06.2010, 03:29
общий
Лисневская Мария Геннадьевна:
А Вы обратили внимание, что при x=[$177$]4 функция неопределена, т.к. получается деление на 0?
Это специально такой подвох заложен?
И что делаем в этом случае?
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Неизвестный
05.06.2010, 06:41
общий
Подвоха нет, просто не подумала об этом обстоятельстве. В таком случае, мне кажется, немного изменим условие, сделав интервал от -10 до 2
давно
Посетитель
7438
7205
05.06.2010, 22:28
общий
Лисневская Мария Геннадьевна:
А -4? Я ж говорил о +4 и -4...
Надо еще раз менять... Например, [-3, 3] устроит?
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Неизвестный
06.06.2010, 13:27
общий
Лысков Игорь Витальевич:
:) а намного сложней задача станет,если исключить из промежутка два этих значения?
давно
Посетитель
7438
7205
07.06.2010, 00:03
общий
это ответ
Здравствуйте, Лисневская Мария Геннадьевна.
Примерно так:
Код:
;Программа вычисляет значения функции F(x) в интервале [-10,12] 
;при изменении переменной x шагом 2
;F(x) = a(x^2 + y^2 ) - b/(x^2 - y^2 ),
;где a = -2.5; b = 0.563; y=4
.model tiny, C
.286
.code
.startup

lea di, fx
mov bx, -10
calc_loop:
cmp bx, 12
jg finish
call f, bx
fstp dword ptr [di]
add di, 4
add bx, 2
jmp calc_loop

finish:
mov ax, 4c00h
int 21h

;функция принимает целый параметр Х в стеке
;возвращает в st результат
;в случае деления на 0 возвращает 0 и FC=1
;иначе FC=0
f proc x:word
fild x ;x
fmul st, st(0) ;x^2
fld y ;y,x^2
fmul st, st(0) ;y^2,x^2
fld st ;y^2,y^2,x^2
fadd st(0),st(2) ;y^2+x^2,y^2,x^2
fmul a ;a(y^2+x^2),y^2,x^2
fxch st(2) ;x^2,y^2,a(y^2+x^2)
fsubrp ;x^2-y^2,a(y^2+x^2)

fldz ;загрузим 0
fcomp st(1) ;сравним с 0 (с удалением 0)
fstsw ax ;флаги в ax
sahf ;флаги в регистров флагов
jz ZeroDevide ;=0 -> делить не будем!
fdivr b ;b/(x^2-y^2),a(y^2+x^2)
fsubr ;a(y^2+x^2)-b/(x^2-y^2)
clc
ret
ZeroDevide:
fstp st(1) ;уберем из стека st(1) и вернем 0
stc
ret
f endp

.data
a dd -2.5
b dd 0.563
y dd 4.

.data?
fx dd 12 dup (?)

end


В случае деления на 0 возвращает 0 и FC=1. При желании можно проанализировать.
5
Спасибо, огромное
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Форма ответа