Вычислить сумму ряда (приближенное значение функции sin) - C (СИ)
Формулировка задачи:
Решить задачу, применив оператор повтора WHILE.
Вычислить сумму ряда (приближенное значение функции sin) с точностью eps. Значения x и eps вводятся с клавиатуры. Полученный результат и значение библиотечной функции sin вывести на экран.
Вот часть решения, а дальше не чего не получается:
# include <stdio.h>
# include <conio.h>
# include <math.h>
#pragma argsused
int main(int argc, char* argv[])
{ int j,f,i,x; float eps,sl,s=0.0;
printf ("vedite x, eps");
scanf("%d %f",&x, &eps);
sl=x;
while(fabs(sl)>eps)
{
s=s+sl;
f=1;
for (j=1; j<=2*i+1;j++) f=f*j;
sl=pow(-1,i)*pow(x,2*i+1)/f;
}
return 0;Решение задачи: «Вычислить сумму ряда (приближенное значение функции sin)»
textual
Листинг программы
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
double MySin( double x, double eps );
// функция избавляется от лишних оборотов единичной окружности возвращает только нужное количество радиан
// от угла, переданного как аргумент в радианах
double ClearUnnTurn( double valuePi );
int main( void ) {
// запрашиваем исходные данные у пользователя
double eps, xDegrees;
printf( "Введите аргумент x в градусах " );
scanf( "%lf", &xDegrees );
printf( "Введите точность epsilon " );
scanf( "%lf", &eps );
double xRadians = xDegrees * M_PI / 180.0; // переводим градусы в радианы
// выводим результаты вычислений
printf( "Значение sin( %g )\n", xDegrees );
printf( " - вычисленное с заданной точностью при помощи разложения в степенной ряд = %2.8f\n", MySin( xRadians, eps ) );
printf( " - вычисленное при помощи библиотечной функции = %2.8f\n", sin( xRadians ) );
return EXIT_SUCCESS;
}
double ClearUnnTurn( double valuePi ) {
int sign = 1; // знак радианной меры
if ( valuePi < 0 ) // если радианная мера отрицательна
sign = -1; // запоминаем это
valuePi = fabs( valuePi ); // берем абсолютное значение радианной меры
int countUnnecessary = valuePi / ( 2.0 * M_PI ); // ищем количество оборотов
if ( countUnnecessary >= 1 ) // если есть лишние обороты
valuePi -= ( countUnnecessary * 2 * M_PI ); // значит убираем ненужные
return valuePi * sign; // возвращаем результат, учитывая знак
}
double MySin( double x, double eps ) {
x = ClearUnnTurn( x ); // тут
double an, s;
int n;
n = 2;
an = x;
s = an;
while ( fabs( an ) > eps ) {
an *= -x * x / ( n * ( n + 1 ) ); // тут
s += an;
n += 2;
}
return s;
}
Объяснение кода листинга программы
- В функции main() пользователю предлагается ввести значение аргумента x в градусах и точность epsilon.
- Аргумент x переводится из градусов в радианы.
- Вычисляется приближенное значение функции sin(x) с заданной точностью при помощи разложения в степенной ряд (функция MySin()).
- Также вычисляется значение функции sin(x) при помощи библиотечной функции sin().
- В функции ClearUnnTurn() радианная мера избавляется от лишних оборотов.
- В функции MySin() используется итерационный процесс для вычисления приближенного значения функции sin(x).
- При вычислении значения функции MySin() используется итерационный процесс, который продолжается до тех пор, пока абсолютное значение текущего приближения не станет меньше заданной точности epsilon.
- Значение функции sin(x) вычисляется с помощью библиотечной функции sin() и сравнивается с приближенным значением, полученным с помощью функции MySin().