memb:=2;
sum:=0;
n:=0;
repeat
sum:=sum+memb;
imc(n);
memb:=memb*2/n;
until memb<=0.001;
Сумма ряда.
Есть такая задачка - надо проссумировать ряд с точностью E=0.001
A[SIZE="1"]n[/SIZE]=2^n / (n-1)! и вывести на экран значение суммы.
Проблем с описанием 2 в степени n и факториала n-1 не существует.
Проблема если я правильно все сделал - проблема в типе числа. real и extended писал про переполнение. int64 - целое, а я более чем уверен, что конечный ответ - число не целое.
Чего хочется получить на форуме? Ответ и желательно объяснение :rolleyes:
Берем k-ый и k+1 ый-елементы и считаем во сколько раз они отличаются. И потом в цикле каждый следуйший елемент при суммировании увеличивать на это значение. Тогда не прийдется считать факториалы и степени
Код:
Примерно так...
только начинаем не с 0, а с 1
Lone Wolf, ну была такая мысль, упростить и просуммировать до точности, но что-то подсказывало, что все равно будет фигня. Но, так как это рекуррентные задачи и препод по алгебре почти также раскинул все - попробую сделать так.
wanja, что-то не нравится мне этот код. Но все равно спасибо :)
a:=2;
b:=1;
n:=1;
x:=a/b;
repeat // суммирование A n-ых
n:=n+1; - я забыл про увеличение n :)
a:=a*2;
b:=fact(n-1);
x:=x+a/b;
until 1/n<=0.001;
label1.Caption:= floattostrf(x,ffgeneral,20,18); // вывод суммы ряда
end;
В итоге - сумма ряда с точностью E=0.001 равна 14,7781121978613005
Ну вообще-то в исходном коде увеличение как раз было.Делалось это с помощью Inc(n).Гораздо более удобный способ увеличить на 1;)
[/OFFTOP]
Цитата: @pixo $oft
[OFFTOP]
Ну вообще-то в исходном коде увеличение как раз было.Делалось это с помощью Inc(n).Гораздо более удобный способ увеличить на 1;)
[/OFFTOP]
Ну вообще-то в исходном коде увеличение как раз было.Делалось это с помощью Inc(n).Гораздо более удобный способ увеличить на 1;)
[/OFFTOP]
оффтоперы отакуэ. ну где ты видел исходный код???
он про код wanja.
Например у меня, мой вариант, при использывании в качестве погрешности текущий елемент сошелся за 12 шагов, при изменении погрешности на 1/n за 1000....
UPDATE
вот исправленный код предложеный wanja
[highlight=pascal]
var memb,sum,n:extended;
begin
memb:=2;
sum:=2;
n:=2;
repeat
memb:=memb*2/(n-1);
sum:=sum+memb;
n:=n+1;
until memb<=0.001;
writeln('S(',n,')=',sum)
end.
[/highlight]
сравни со своим.
Если вывести все значения An - то после первых 24 у меня идут ничтожно малые значения, которые на ответ даже не вляют, поэтому и ответ после них не меняется.
Lone Wolf, с твоим кодом (исправленный код warja) какой ответ получается?
интересно чем препод руководствовался, когда такую оценку погрешности давал... но это так мысли в слух.. Меня бы в мое студенчество, за такое наверно отчислили )))
фишка в том, что ряд нужно было с каким-то рекуррентным коэффициентом. спасает только то, что я все сдал и эти еще не объясняли на лекции.
взял щас другую лабу - вроде легче :)
вопрос: что за рекуррентный коэффициент? :)