IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения.
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

 
 Ответить  Открыть новую тему 
> Помогите! Расхождение ряда
сообщение
Сообщение #1





Группа: Пользователи
Сообщений: 9
Пол: Мужской

Репутация: -  0  +


Дана задача: с помощью библиотечной функции 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;


Сообщение отредактировано: Lapp -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Гость






Вообще-то функция 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?
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Гуру
*****

Группа: Пользователи
Сообщений: 1 220
Пол: Мужской

Репутация: -  16  +


Цитата
на Vax-11

С_ума_сойти unsure.gif
Советский аналог - серия СМ? СМ-1420, 1810 etc?
Там же есть компилятор Pascal'я. Точно помню, что есть. Я на 1420 делал курсач в 88-м
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4





Группа: Пользователи
Сообщений: 9
Пол: Мужской

Репутация: -  0  +


делаю так сложно, потому что эта задача что-то вроде подготовки, чтобы потом в кодах все на 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

 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Гость






Да, собственно, ошибки-то нет как таковой:
function TForm1.F2(sx:smallint):smallint;
var
x,accm,a,sf:smallint; // Отсюда F2 убери, и посмотри ТЕПЕРЬ на результат
n:integer;
temp1:longint;
...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6





Группа: Пользователи
Сообщений: 9
Пол: Мужской

Репутация: -  0  +


Пробовал smile.gif не получается все равно, такое ощущение, что сумма ряда не правильно складывается...
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7


Гость






Цитата
не получается все равно, такое ощущение, что сумма ряда не правильно складывается...
Это ты кому-нибудь другому расскажешь, ладно? В Edit1 выводится 0.000203475073580706, что меньше твоей погрешности, значит сумма считается даже точнее...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #8





Группа: Пользователи
Сообщений: 9
Пол: Мужской

Репутация: -  0  +


Volvo, честно у меня какую-то чушь выдает.....когда ставлю вычисление ряда от одного значения -6553 , на выходе функции получается -749, что потом делим на 32768 и получается верный результат, но почему то sf меняется само на 134 и получается чушь sad.gif(( может что-то с делфи???

Добавлено через 16 мин.
вот в этой строке sf:= F2(sx); sad.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #9





Группа: Пользователи
Сообщений: 9
Пол: Мужской

Репутация: -  0  +


Volvo подскажи пожалуйства, в чем проблема может быть, что у тебя выводит, а у меня нет? sad.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #10





Группа: Пользователи
Сообщений: 9
Пол: Мужской

Репутация: -  0  +


Volvo, огромное спасибо smile.gif)) Все допер, все заработало !! good.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 19.04.2024 9:23
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name