Алгоритм вычисления бесконечной суммы с заданной точностью - C (СИ)
Формулировка задачи:
Здравствуйте, хотелось бы сразу перейти к сути, в общем есть следующая задание, смотреть вложение.
А также есть строгие требования, из-за которых каждый член заданной нам последовательности должен вычисляться не по новой, а благодаря вычислениям выполненным на стадии вычисления предыдущего члена последовательности.
В данном случаи, как я понимаю, нельзя позволять себе вычислять факториал на каждой итерации, из-за чересчур быстрого роста.
Как итог я имею следующую код, которая судя по всему работает неверно, хотелось бы услышать ваше мнение, а может быть и увидеть и ваш код, господа и дамы. Буду благодарен за любую активность.
Поиском пользовался, находил что-то подобное, но там задачи решались в лоб, что мне совершено не подходит.
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
main(){
float eps,sum,a;
int k;
printf("Enter eps\n");
scanf("%f",&eps);
a=-1.0; sum=sum+a; k=2;
while(fabs(a)>eps){
a=a*(-1/k);
k=k+1;
sum=sum+a;
}
printf("%f\n",sum);
system("pause");
}Решение задачи: «Алгоритм вычисления бесконечной суммы с заданной точностью»
textual
Листинг программы
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int main( void ) {
double eps = 0.00001;
double curr = -1;
double sum = curr;
int counter = 2;
while ( fabs( curr ) >= eps ) {
curr *= -1.0 / counter++;
sum += curr;
}
printf( "сумма = %f\n", sum );
return EXIT_SUCCESS;
}
Объяснение кода листинга программы
- Подключение необходимых библиотек: iostream, cmath
- Объявление переменных: a. eps — погрешность вычислений, равная 0.00001; b. curr — текущее значение члена ряда, равное -1; c. sum — сумма ряда, равная первому члену ряда, то есть curr; d. counter — счётчик, определяющий номер текущего члена ряда.
- Запуск цикла while, который выполняется до тех пор, пока абсолютное значение текущего члена ряда (curr) не станет меньше или равно погрешности (eps).
- Внутри цикла while выполняем следующие действия: a. Умножаем текущий член ряда на -1.0/counter (меняем знак и делим на текущее значение счётчика); b. Обновляем значение sum, добавляя к нему текущий член ряда; c. Увеличиваем значение счётчика на 1.
- После выполнения цикла while выводим на экран значение суммы ряда (sum).
- Возвращаем EXIT_SUCCESS, т.е. программа успешно завершилась.