Помощь - Поиск - Пользователи - Календарь
Полная версия: Помогите! Расхождение ряда
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Fellout
Дана задача: с помощью библиотечной функции ln(1+x) вычислить расхождение, реализовывая этот ряд с помощью рекурентной формулу, а также использовать одноадресную систему команд, тоесть можно использовать только одну переменную, вторая в операции обязательно проходит через аккумулятор. Вычитая получившуюся сумму ряда расхождение не должно привышать 3*10 в -4 степени. В чем ошибка, расхождение никак не сходится?? sad.gif(( Помогите пожалуйста, а то кроме реализации на ЯВУ нужно ещё сделать эту задачу на Vax-11, а осталась только неделя sad.gif
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
Вообще-то функция 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;

writeln(s :12 :7);

writeln(ln(1 + x) :10 :7); { <--- для проверки }
end.



Цитата
а то кроме реализации на ЯВУ нужно ещё сделать эту задачу на Vax-11
На чем, в кодах что-ли? Или ASM?
Ozzя
Цитата
на Vax-11

С_ума_сойти unsure.gif
Советский аналог - серия СМ? СМ-1420, 1810 etc?
Там же есть компилятор Pascal'я. Точно помню, что есть. Я на 1420 делал курсач в 88-м
Fellout
делаю так сложно, потому что эта задача что-то вроде подготовки, чтобы потом в кодах все на 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 нет паскалевского компилятора...sad.gif

Добавлено через 8 мин.
Забыл ещё добавить, что после того, как получится добиться точности 3*10 в -4, в подпрограмме с рекурентной формулой нужно заменить умножение и деление ещё на две функции. И точность не должна поменяться....по крайней мере на много не должна поменяться smile.gif


деление:
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
Да, собственно, ошибки-то нет как таковой:
function TForm1.F2(sx:smallint):smallint;
var
x,accm,a,sf:smallint; // Отсюда F2 убери, и посмотри ТЕПЕРЬ на результат
n:integer;
temp1:longint;
...
Fellout
Пробовал smile.gif не получается все равно, такое ощущение, что сумма ряда не правильно складывается...
volvo
Цитата
не получается все равно, такое ощущение, что сумма ряда не правильно складывается...
Это ты кому-нибудь другому расскажешь, ладно? В Edit1 выводится 0.000203475073580706, что меньше твоей погрешности, значит сумма считается даже точнее...
Fellout
Volvo, честно у меня какую-то чушь выдает.....когда ставлю вычисление ряда от одного значения -6553 , на выходе функции получается -749, что потом делим на 32768 и получается верный результат, но почему то sf меняется само на 134 и получается чушь sad.gif(( может что-то с делфи???

Добавлено через 16 мин.
вот в этой строке sf:= F2(sx); sad.gif
Fellout
Volvo подскажи пожалуйства, в чем проблема может быть, что у тебя выводит, а у меня нет? sad.gif
Fellout
Volvo, огромное спасибо smile.gif)) Все допер, все заработало !! good.gif
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.