Вычислить сумму ряда (приближенное значение функции 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;
}

Объяснение кода листинга программы

  1. В функции main() пользователю предлагается ввести значение аргумента x в градусах и точность epsilon.
  2. Аргумент x переводится из градусов в радианы.
  3. Вычисляется приближенное значение функции sin(x) с заданной точностью при помощи разложения в степенной ряд (функция MySin()).
  4. Также вычисляется значение функции sin(x) при помощи библиотечной функции sin().
  5. В функции ClearUnnTurn() радианная мера избавляется от лишних оборотов.
  6. В функции MySin() используется итерационный процесс для вычисления приближенного значения функции sin(x).
  7. При вычислении значения функции MySin() используется итерационный процесс, который продолжается до тех пор, пока абсолютное значение текущего приближения не станет меньше заданной точности epsilon.
  8. Значение функции sin(x) вычисляется с помощью библиотечной функции sin() и сравнивается с приближенным значением, полученным с помощью функции MySin().

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

5   голосов , оценка 3.8 из 5