Условие:
Вычислить сумму ряда с точностью ε=10(в -5 степени)
Ряд представлен в прикрепленном файле.
Текст программы:
program z1;
const e=0.00001;
var
s{Сумма ряда},n{член ряда},x,x1{Переменная}:real;
i,k:integer;{счетчик}
begin
s:=0;
i:=2;
Write('VVedite x(<=1.01): ');Read(x);
n:=((i*sqr(x))+1)/(sqr(i+1));
s:=s+n;
REPEAT
i:=i+1;
x1:=Power(x,i);n:=((x1*i)+1)/(sqr(i));
if odd(i)=false{чет} then begin
s:=s+n;
i:=i+1;end
else
s:=s-n;
i:=i+1;
until n<e;
writeln(s:20:12);
end.
Эскизы прикрепленных изображений
Во-первых, ты не привел свою реализацию функции Power. А во-вторых я переписал программку по-другому, и вот что получилось (в твою программу добавил вычисление Power через exp(i * ln(x))):
Твоя программа:
Когда я делал через експаненту, то ошибку выдавало деления на ноль,и вообще это я добавил услови что вводимое число должно быть меньше либо равно 1.1, просто если другое вводишь получается вещественное переполнение.
Помогите плиз, как правильно надо делать?
Я сделал вот так:
program z1;Вроде нигде не ошибся...
const e=0.00001;
var
s, next, chisl: real;
x: real;
i, sign: integer;
begin
write('X = '); readln(x);
s := 0;
sign := 1; i := 1; chisl := x;
repeat
chisl := chisl*x; { <--- Это заменяет возведение в степень через функцию }
next := ((i + 1) * chisl + 1) / sqr(1.0*i + 1);
inc(i);
s := s + sign * next;
sign := -sign; { <--- Меняем знак следующего члена ряда }
until abs(next) < e;
writeln(s:20:12);
end.
А почему нельзя к Х применять числа большие 1.1, как понял я - там получается очень большое число, которое не влезает в границы типа real, а может и нет, интересно как оно на самом деле?
Понятно. Спасибо!