Вычислить сумму ряда (приближенное значение функции 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().
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д