Вычислить сумму ряда (приближенное значение функции Sin)

Тема в разделе "Общие вопросы по С и С++", создана пользователем maryfly009, 14 апр 2010.

Статус темы:
Закрыта.
  1. maryfly009

    maryfly009 Гость

    Здравствуйте уважаемые программисты! Помогите пожалуйста найти ошибку в программе.
    Код (Text):
     
    //Подключение библиотеки стандартного ввода и вывода
    #include<stdio.h>
    //Подключение библиотеки математических функций
    #include<math.h>

    //Функция вычисления факториала
    double Factorial(unsigned n)
    {
    //Объявление и инициализация переменных функции
    double p=1.0;
    unsigned i = 2;
    //Цикл вычисления значения факториала числа
    for(;i<=n;i++) p*=(double)i;
    //Возврат полученного значения
    return p;
    }

    int main()
    {
    //Объявление и инициализация
    //переменных программы
    double sum=0, i=0, t=1, x, eps;

    //Приглашение к вводу x
    printf("x = ");
    //Ввод значения x
    scanf("%lf",&x);

    //Приглашение к вводу eps
    printf("eps = ");
    //Ввод значения eps
    scanf("%lf",&eps);

    //Цикл вычисления суммы ряда с заданной точностью
    do
    {
    t *= pow((-1), i) * ((pow(x, 2*i+1)) / (Factorial(2 * i + 1)));
    sum += t;
    i++;
    }while( fabs(t) >= eps );

    //Вывод значения суммы
    printf("sum = %5.4lf\n", sum);
    //Вывод значения библиотечной функции sin
    printf("sin = %5.4lf\n", sin(x));

    return 0;
    }
    при x=1
    sum = 0.8319
    sin = 0.8415
    вроде значения приближенно равны

    а при x = 5
    sum = -64289.9875
    sin = -0.9589
    существенная разница

    подскажите в чём проблема
     

    Вложения:

  2. hosm

    hosm * so what *

    Регистрация:
    18 май 2009
    Сообщения:
    2.450
    Симпатии:
    7
    мне лично это не понравилось: t *=
    запросто могу ошибаться)
     
  3. maryfly009

    maryfly009 Гость

    спасибо, действительно в этом была ошибка
     
  4. zeus

    zeus Гость

    А я бы сделал бы так
    Код (C++):
    #include <stdio.h>
    #include <math.h>

    double calc_sin(double x, double eps)
    {
    double res = x, t = 0.0;
    int i = 1;

    while (abs(x-t) >= eps)
    {
    t = res;
    res *= x*x / (2*i) / (2*i + 1);
    } // while

    return res;
    } // calc_sin

    int main(void)
    {
    double x, eps;

    printf("x = ");
    scanf("%lf",&x); // Ввод значения x

    printf("eps = ");
    scanf("%lf",&eps); // Ввод значения eps

    printf("calc_sin = %5.4lf\n", calc_sin(x, eps)); // Вывод значение синуса
    printf("sin = %5.4lf\n", sin(x)); //Вывод значения библиотечной функции sin

    return 0;
    } // main
     
Загрузка...
Статус темы:
Закрыта.

Поделиться этой страницей