1. Заголовок темы должен быть информативным. В противном случае тема удаляется ... 2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения. 3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали! 4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора). 5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM! 6. Одна тема - один вопрос (задача) 7.Проверяйте программы перед тем, как разместить их на форуме!!! 8.Спрашивайте и отвечайте четко и по существу!!!
Дана задача: с помощью библиотечной функции 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;
делаю так сложно, потому что эта задача что-то вроде подготовки, чтобы потом в кодах все на 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;
не получается все равно, такое ощущение, что сумма ряда не правильно складывается...
Это ты кому-нибудь другому расскажешь, ладно? В Edit1 выводится 0.000203475073580706, что меньше твоей погрешности, значит сумма считается даже точнее...
Volvo, честно у меня какую-то чушь выдает.....когда ставлю вычисление ряда от одного значения -6553 , на выходе функции получается -749, что потом делим на 32768 и получается верный результат, но почему то sf меняется само на 134 и получается чушь (( может что-то с делфи???
Добавлено через 16 мин. вот в этой строке sf:= F2(sx);