Помощь - Поиск - Пользователи - Календарь
Полная версия: Переполнение
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Zundell
Ниче не понимаю пачиму ошибку переполнения выдает(((
Пасмарите плиз:
Используя оператор цикла, найти сумму элементов!При определении суммы членов ряда использовать реккурентную формулу.
Найти сумму ряда с точностью Е=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
Я не вникал, но переполнение возникает из-за того что 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
arhimag, а прочтение условий что, НЕ для тебя?
Цитата
При определении суммы членов ряда использовать реккурентную формулу.
А объясни-ка мне, что такое рекуррентная формула во-первых, и где она у тебя в программе - во вторых...
мисс_граффити
Ты правда считаешь, что 3n^n и (3n)^n - это одно и то же?
Цитата
Я не вникал,

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

Правда?
Приближенные значения:
0.333
0.167
0.074
0.031
0.013
...
arhimag
Про рекуррентную формулу я забыл sad.gif
а по поводу возражения мисс граффити, то я думал что там (3n)^n, но этот глюк исправлен.
мисс_граффити
Рекуррентная формула:
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
Код
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
мисс_граффити

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

Добавлено:
тьфу...т.е An*((n+1)/n)^(n+1)
мисс_граффити
напиши, как выводил
Zundell
Мисс Графити,извиняюсь..я у себя ошибку нашел,немного не так считал...ты правильно вывела...но вот только если писать A(n)*(n/(n+1))^n,то Паскаль всеравно перевыполнение выдает,но вот если An*((ln(n)*n)/(ln(n)*(n+1))),то все нормс считает!Спасибо всем за помощь...все дело в рекуррентке было.
мисс_граффити
считает-то нормально, только совсем другое smile.gif))
Zundell
Почему???там ведь при выводе рекуррентки и в числителе в степени N,так и в знаменателе N!почему ошибка то?
мисс_граффити
Ты думаешь, что ln(n)*n=n^n?
А почему?
Возьмем для примера число е (чтобы проще было считать).
ln(e)*e=1*e=e
Это совсем не то, что e^e, правда?
Zundell
хм...а вот так прральна буит?An*(exp(ln(n)*n))/(exp(ln(n)*(n+1))))
мисс_граффити
да... но так ты приходишь к варианту arhimagа.
причем у него переполнение будет возникать с меньшей степенью вероятности: он сначала считает n/(n+1), а потом это число (заведомо меньше 1) возводит в степень. ты же по отдельности считаешь n^n и n^(n+1) и только после этого делишь. вот переполнение и вылезает.
Zundell
Я щя проверил,мой вариант...переполнения не возникает.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.