Что не так с кодом? - C (СИ)
Формулировка задачи:
Всем здравствуйте. Программа должна вычислять значение e^(2*x) в точках X∈[0;0,8] шагом h=0,1 и точностью эпсилон=0,00001. При компиляции цикл идет бесконечно и значение функции всегда=1. Пожалуйста, помогите закончить код:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <conio.h>
long int fact(long int n)
{
if (n == 0 || n == 1) return 1;
return n * fact(n - 1);
}
int main()
{
int i;
float x, t, xn=0, xk=0.8, s, h=0.1, n=8, eps=0.00001;
x=xn;
puts("Программа вычисляет значение exp^2x , где X принадлежит промежутку [0;0,8] с шагом 0,1 и точностью эпсилон=0,00001");
t=1;
s=1;
for (i=1;i<n;i++)
{
t=t*pow((2*x),i);
s=s+t*fact(i);
while (abs(s)>eps)
{
printf("\n При X=%2.2f exp^2x(X)=%2.2f\n",x,s);
x=x+h;
}
return 0;}
}Решение задачи: «Что не так с кодом?»
textual
Листинг программы
#include <stdio.h>
#include <math.h>
long fact(long n)
{
if(!n)
return 1;
return n * fact(n - 1);
}
double seq_member(double x, long n)
{
return pow(2 * x, n) / fact(n);
}
double seq_sum(double x, double eps)
{
double sum = 0;
long n = 0;
for(double sm = seq_member(x, n); sm > eps; sm = seq_member(x, ++n))
sum += sm;
return sum;
}
int main()
{
const double eps = 1e-5;
double xmin = 0;
double xmax = .8;
double step = .1;
for(; xmin <= xmax; xmin += step)
printf("f(%lf)=%lf ", xmin, seq_sum(xmin, eps));
}
Объяснение кода листинга программы
- В функции fact() реализован рекурсивный вычислительный алгоритм факториала для неотрицательных целых чисел.
- В функции seq_member() вычисляется член последовательности, для этого используется формула n! / (x^n * (1-x)^n).
- В функции seq_sum() вычисляется сумма членов последовательности в интервале от x до eps, для этого используется итерационный цикл.
- В функции main() задаются константы и переменные: eps = 1e-5, xmin = 0, xmax = 0.8, step = 0.1.
- В цикле for вызывается функция seq_sum() с аргументами xmin и eps, и выводится на экран значение суммы и шаг xmin.
- Цикл выполняется, пока xmin меньше или равно xmax.