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

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

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

 
 Ответить  Открыть новую тему 
> Помогите! Расхождение ряда
Fellout
сообщение 12.12.2008 15:18
Сообщение #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 - 13.12.2008 2:07
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 12.12.2008 15:46
Сообщение #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?
 К началу страницы 
+ Ответить 
Ozzя
сообщение 12.12.2008 16:10
Сообщение #3


Гуру
*****

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

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


Цитата
на Vax-11

С_ума_сойти unsure.gif
Советский аналог - серия СМ? СМ-1420, 1810 etc?
Там же есть компилятор Pascal'я. Точно помню, что есть. Я на 1420 делал курсач в 88-м
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Fellout
сообщение 12.12.2008 17:14
Сообщение #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 
 К началу страницы 
+ Ответить 
volvo
сообщение 12.12.2008 17:26
Сообщение #5


Гость






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





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

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


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


Гость






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





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

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


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

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





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

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


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





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

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


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

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

 



- Текстовая версия 20.07.2025 14:20
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"