Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ Переполнение

Автор: Zundell 20.01.2007 21:44

Ниче не понимаю пачиму ошибку переполнения выдает(((
Пасмарите плиз:
Используя оператор цикла, найти сумму элементов!При определении суммы членов ряда использовать реккурентную формулу.
Найти сумму ряда с точностью Е=10^-3 , общий член которого равен An=n!/(3n^n).
Вот текст моей программки:

CONST
i=0.1E-2;
var
n: integer;
AN, summa:extended;
begin
summa:=0; n:= 1; AN:= 1/2;
while AN>i do
begin
summa:= summa + AN; n:=n+1;
AN:= An*(ln(n+1)*((n+1)/n));
end;
writeln ( 'summa=', summa:2:4);
Writeln ('4islo=', AN:2:4);
readln;
end.




Рекурентку я посчитал,она представленна в тексте программы.Очень нужна помощь.Заранее очень благодарен

Автор: arhimag 20.01.2007 23:53

Я не вникал, но переполнение возникает из-за того что AN изначально больше i и оно не убывает, а даже шустро возрастает во время исполнения программы.

Добавлено:
я не считал сумму этого ряда, но эта программа должна работать правильно:

Код

CONST
i=0.1E-2;
var
n: integer;
AN, summa:extended;
function factorial(n:integer):real;
var i: integer;
    f: real;
begin
     f:=1;
     for i:=1 to n do
         f:=f*i;
     factorial:=f;
end;
function power(a,b : real):real;
begin
     power:=exp(b*ln(a));
end;
begin
summa:=0; n:= 1; AN:= 1/2;
while AN>i do
begin
AN:=factorial(n)/3*power(n,n);
summa:= summa + AN; n:=n+1;
end;
writeln ( 'summa=', summa:2:4);
Writeln ('4islo=', AN:2:4);
readln;
end.

Автор: volvo 20.01.2007 23:57

arhimag, а прочтение условий что, НЕ для тебя?

Цитата
При определении суммы членов ряда использовать реккурентную формулу.
А объясни-ка мне, что такое рекуррентная формула во-первых, и где она у тебя в программе - во вторых...

Автор: мисс_граффити 20.01.2007 23:57

Ты правда считаешь, что 3n^n и (3n)^n - это одно и то же?

Цитата
Я не вникал,

Заметно.
Цитата
но переполнение возникает из-за того что AN изначально больше i и оно не убывает, а даже шустро возрастает во время исполнения программы.

Правда?
Приближенные значения:
0.333
0.167
0.074
0.031
0.013
...

Автор: arhimag 20.01.2007 23:59

Про рекуррентную формулу я забыл sad.gif
а по поводу возражения мисс граффити, то я думал что там (3n)^n, но этот глюк исправлен.

Автор: мисс_граффити 21.01.2007 0:10

Рекуррентная формула:
A(n+1)=(n+1)!/(3(n+1)^(n+1))=n!*(n+1)/(3*(n+1)^n*(n+1))=n!/(3(n+1)^n)
A(n)=n!/(3n^n)
A(n+1)=A(n)*(n^n)/((n+1)^n)=A(n)*(n/(n+1))^n
У меня так получилось...
а откуда взялось

Цитата
AN:= An*(ln(n+1)*((n+1)/n));
?
Это ты так пытался в степень возвести? Или я ошиблась при выводе формулы?

Автор: arhimag 21.01.2007 0:17

Код
CONST
i=0.1E-2;
var
n: integer;
AN, summa:extended;
function power(a,b : real):real;
begin
     power:=exp(b*ln(a));
end;
begin
summa:=0; n:= 1; AN:= 1/3;
while AN>i do
begin
summa:= summa + AN;
AN:=AN*power(n/(n+1),n);
n:=n+1;
end;
writeln ( 'summa=', summa:2:4);
Writeln ('4islo=', AN:2:4);
readln;
end.

Вольво, найдешь ошибки, скажи, исправлю.

Добавлено:
Только заметил, с формулой мисс граффити опередила

Автор: Zundell 21.01.2007 2:24

мисс_граффити

у меня рекурентка получилась An*(n+1)^(n+1)/n
может я тоже чтот неправильно посчитал?

Добавлено:
тьфу...т.е An*((n+1)/n)^(n+1)

Автор: мисс_граффити 21.01.2007 2:46

напиши, как выводил

Автор: Zundell 21.01.2007 3:45

Мисс Графити,извиняюсь..я у себя ошибку нашел,немного не так считал...ты правильно вывела...но вот только если писать A(n)*(n/(n+1))^n,то Паскаль всеравно перевыполнение выдает,но вот если An*((ln(n)*n)/(ln(n)*(n+1))),то все нормс считает!Спасибо всем за помощь...все дело в рекуррентке было.

Автор: мисс_граффити 21.01.2007 4:37

считает-то нормально, только совсем другое smile.gif))

Автор: Zundell 21.01.2007 6:23

Почему???там ведь при выводе рекуррентки и в числителе в степени N,так и в знаменателе N!почему ошибка то?

Автор: мисс_граффити 21.01.2007 6:28

Ты думаешь, что ln(n)*n=n^n?
А почему?
Возьмем для примера число е (чтобы проще было считать).
ln(e)*e=1*e=e
Это совсем не то, что e^e, правда?

Автор: Zundell 21.01.2007 18:15

хм...а вот так прральна буит?An*(exp(ln(n)*n))/(exp(ln(n)*(n+1))))

Автор: мисс_граффити 21.01.2007 18:37

да... но так ты приходишь к варианту arhimagа.
причем у него переполнение будет возникать с меньшей степенью вероятности: он сначала считает n/(n+1), а потом это число (заведомо меньше 1) возводит в степень. ты же по отдельности считаешь n^n и n^(n+1) и только после этого делишь. вот переполнение и вылезает.

Автор: Zundell 21.01.2007 19:15

Я щя проверил,мой вариант...переполнения не возникает.