Другие языки программирования и технологии

Алгоритм на Pascal

Помогите пожалуйста составить алгоритм, или исправить на ошибку. Как я понимаю, ошибка в строке, отмеченной стрелкой. Просто в выш. мате я особо не силен.
Ты меняешь значение t каждый раз, а нужно прибавлять к текущему t следующий член ряда. Вот программа. Корректно работает до аргумента примерно 25, потом накапливается ошибка, вероятно, из-за больших значений степеней и факториалов. Ну с учетом периода синуса 2пи можно работать в этих пределах.
var
x1, x, y, xt, eps: real; {заданное значение аргумента, его модуль для вычислений,
вычисленное значение функции Y, текущий член ряда xt и заданная точность вычисления eps}
n, z, k: integer;

BEGIN
write('Введите X и точность вычисления: '); readln(x1, eps);
x:=abs(x1); {берем модуль аргумента, чтобы не путаться со знаками}
y:=x; {присваиваем функции значение первого члена ряда}
xt:=-x*x*x/6; {вычисляем второй член ряда}
y:=y+xt; {вычисляем значение функции}
z:=1; {z определяет знак следующего члена ряда}
n:=5; {показатель степени и факториал следующего члена ряда}
k:=2; {счетчик итераций, два члена уже найдено}
while abs(xt)>eps do {вычисляем фукцию, пока следующий член не станет меньше заданной точности}
begin
xt:=z*abs(xt)*x*x/(n-1)/n; {находим следующий член ряда}
y:=y+xt; {вычисляем значение функции}
z:=z*(-1); {меняем знак для следующего члена}
n:=n+2; {увеличиваем на 2 показатель степени и факториал для следующего члена}
inc(k);
end;
if x1<0 then y:=y*(-1); {если аргумент был отрицательным - меняем у функции знак (синус нечетная функция) }
writeln('Вычисленное значение sin(x)= ',y, ' за ',k,' итераций'); {результат}
writeln('Контрольное значение: ',sin(x1))
END.
==========================================
Введите X и точность вычисления: 0.3 0.0001
Вычисленное значение sin(x)= 0.29552025 за 3 итераций
Контрольное значение: 0.29552020666134
ЕС
Евгений Синько
25 006
Лучший ответ
Евгений Синько Немного разобрался с твоей программой. Во-первых, первое значение t равно не 1, а z. Нужно t:=z; А потом уже в цикле перед последним членом ((2*n+1)-1) должно быть деление, или все два члена в скобки взять еще одни. Они оба в знаменателе, а ты на один делишь, а на второй умножаешь.
Евгений Синько Ну и до кучи ((2*n+1)-1)=2*n
Евгений Синько И это еще не всё. S тоже присвоить в начале z, а не 1. И t в цикле ты считаешь не правильно. Степень z ты считаешь полностью, а у факториала - только два последних члена. Тогда и факториал полностью считай, или как у меня - домножай на z² вместо степени.
Евгений Синько Выложи программу в тексте, подправлю.
Евгений Синько Оптимизировал свою программу под твою. У тебя лучше сделано.

var
x, y, xt, eps: real;
n: integer;

BEGIN
write('Введите X и точность вычисления: '); readln(x, eps);
y:=x;
xt:=x;
n:=1;
while abs(xt)>eps do
begin
xt:=-xt*x*x/(2*n+1)/(2*n);
y:=y+xt;
inc(n);
end;
writeln('Вычисленное значение sin(x)= ',y, ' за ',n,' итераций');
writeln('Контрольное значение: ',sin(x))
END.
Кудайберген Атаубаев Спасибо огромное)
var x: real;
function sinus(x: real): real;
var y, p, s, q: real; begin
y := - x * x; p := x; sinus := x;
q := 1; while abs(p) > 1e-4 do begin
q := q + 2; p := p * y / (q * (q - 1));
sinus := sinus + p end;
writeln(trunc((q + 1) / 2),
' terms of the series') end;
begin writeln(sinus(0.3)) end.
Ильяс Мансуров
Ильяс Мансуров
29 440
Кудайберген Атаубаев Спасибо) но немного не то