Дана задача: с помощью библиотечной функции ln(1+x) вычислить расхождение, реализовывая этот ряд с помощью рекурентной формулу, а также использовать одноадресную систему команд, тоесть можно использовать только одну переменную, вторая в операции обязательно проходит через аккумулятор. Вычитая получившуюся сумму ряда расхождение не должно привышать 3*10 в -4 степени. В чем ошибка, расхождение никак не сходится?? (( Помогите пожалуйста, а то кроме реализации на ЯВУ нужно ещё сделать эту задачу на Vax-11, а осталась только неделя
Var sx, sf:smallint; x,F1,F3:real; diff:real; Begin diff:=0; for sx:=-6553 to 16384 do begin x:=sx/32768; //x:=sx div 32768; F1:=ln(1+x); sf:= F2(sx); F3:=sf/32768; //F3:= sf div 32768; if diff < abs(F1-F3) then diff:= abs(F1-F3); end; edit1.Text:=floattostr(diff); end;
function TForm1.F2(sx:smallint):smallint; var x,accm,a,sf,F2:smallint; n:integer; temp1:longint; begin n:=1; sf:=sx; a:=sx; x:=sx; while a<>0 do Begin accm:=-1; a:=a*accm; accm:=x; temp1:=a*accm; temp1:=temp1+16384; a:=temp1 div 32768; accm:=n; //a:=mul(a,accm) a:=a*accm; accm:=1; n:=n+accm; accm:=n; a:=a div accm; //a:=divi(a,accm); accm:=a; sf:=sf+accm; end; F2:=sf; end;
volvo
12.12.2008 19:46
Вообще-то функция ln(1 + x) при (-1) < x <= 1 раскладывается в ряд x - x2/2 + x3/3 - x4/4 + ... так что тебе достаточно:
const eps = 0.0003;
var X: real; s, p: real; i: integer; begin x := 0.345;
s := 0; i := 0; p := - 1; repeat inc(i); p := - p * x; s := s + p / i; until abs(p / i) < eps;
а то кроме реализации на ЯВУ нужно ещё сделать эту задачу на Vax-11
На чем, в кодах что-ли? Или ASM?
Ozzя
12.12.2008 20:10
Цитата
на Vax-11
С_ума_сойти Советский аналог - серия СМ? СМ-1420, 1810 etc? Там же есть компилятор Pascal'я. Точно помню, что есть. Я на 1420 делал курсач в 88-м
Fellout
12.12.2008 21:14
делаю так сложно, потому что эта задача что-то вроде подготовки, чтобы потом в кодах все на vax перенести. Функция это и есть нахождение суммы ряда с помощью рекурентной формулы ---> -(a*x*n/n+1), тоесть разложения ln(1+x) в ряд x-x2/2+x3/3. с занесением одного из операторов в аккумулятор, что требуется по системе команд в задании . Диапозон от -0.2 до 0.5, что в 16-ричной системе соответстует -6553 до 16384. В итого разница между библиотечной функцией и нахождением суммы ряда с помощью рек. формулы, как я уже писал, должна соответствовать 3*10 в -4 степени. Вот и мучаюсь...а в чем ошибка не понимаю...вроде должно быть все элементарно просто, но почему-то никак не сделать...
На нашем эмуляторе Vax нет паскалевского компилятора...
Добавлено через 8 мин. Забыл ещё добавить, что после того, как получится добиться точности 3*10 в -4, в подпрограмме с рекурентной формулой нужно заменить умножение и деление ещё на две функции. И точность не должна поменяться....по крайней мере на много не должна поменяться
деление:
function TForm1.divi(a,b:longint):longint; Var Q:smallint; ct:integer; A1,B1:longint; begin Q:=0; ct:=16; A1:=A; B1:=B shl 16; if A1<0 then A1:=-A1; while ct<>0 do Begin Q:=2*Q; A1:=2*A1; A1:=A1-B1; If A1<0 then A1:=A1+B1 else Q:=Q+1; ct:=ct-1; end; if A<0 then Q:=-Q; end;
умножение : Var a,b:longint; p,po,a1:longint; ct,v:longint; begin p:=0; a1:=a shl 16; ct:=15; while ct<>0 do Begin v:=0; if ((b and 1) = 1) then begin po:=p; p:=p+a1; if (((po<0)and(a1<0)and(p>=0))xor((po>=0)and(a1>=0)and(p<0))) then v:=1; end; p:=p div 2; p:= p xor (v shl 31); if b=-1 then b:=-1 else b:=b div 2; ct:= ct-1; end; if ((b and 1) = 1) then p:=p-a1; p:=p div 2; Edit1.text:=Floattostr(p); end;
end.
М
ну ставьте же теги!! Lapp
volvo
12.12.2008 21:26
Да, собственно, ошибки-то нет как таковой:
function TForm1.F2(sx:smallint):smallint; var x,accm,a,sf:smallint; // Отсюда F2 убери, и посмотри ТЕПЕРЬ на результат n:integer; temp1:longint; ...
Fellout
13.12.2008 0:49
Пробовал не получается все равно, такое ощущение, что сумма ряда не правильно складывается...
volvo
13.12.2008 1:19
Цитата
не получается все равно, такое ощущение, что сумма ряда не правильно складывается...
Это ты кому-нибудь другому расскажешь, ладно? В Edit1 выводится 0.000203475073580706, что меньше твоей погрешности, значит сумма считается даже точнее...
Fellout
13.12.2008 1:56
Volvo, честно у меня какую-то чушь выдает.....когда ставлю вычисление ряда от одного значения -6553 , на выходе функции получается -749, что потом делим на 32768 и получается верный результат, но почему то sf меняется само на 134 и получается чушь (( может что-то с делфи???
Добавлено через 16 мин. вот в этой строке sf:= F2(sx);
Fellout
13.12.2008 3:00
Volvo подскажи пожалуйства, в чем проблема может быть, что у тебя выводит, а у меня нет?
Fellout
13.12.2008 3:22
Volvo, огромное спасибо )) Все допер, все заработало !!
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.