Ряд Тейлора sin x. Программа выводит некорректные значения

Не могу найти ошибку в коде:

# define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <math.h>
#include <locale.h>
int main() {
  setlocale(LC_ALL, "rus");
  double x, E, y, sum;
  long int num, m, n;
  printf("Введите x: \n");
  scanf("%lf", &x);
  printf("Выберите способ для вычисления приближенного значения функции: \n");
  printf("1) с заданной точностью \n");
  printf("2) для заданного количества членов ряда \n");
  printf("Введите номер без скобок \n");
  scanf("%ld", &num);
  y = x;
  sum = 0;
  switch (num) {
  case 1:
    printf("Введите точность: \n");
    scanf("%lf", &E);
    for(m=1; fabs(y)>=E; m+=2){
      sum += y;
      y *= -1.0 * x * x / ((2 * m) * (2 * m + 1));
    }
    printf("Сумма конечного числа элементов ряда: %lf \n", sum);
    break;
  case 2:
    printf("Введите количество членов ряда n:\n");
    scanf("%ld", &n);
    for (m = 1; m <= n; m+=2) {
      sum += y;
      y *= -1.0 * x * x / ((2*m)*(2*m+1));
    }
    printf("Сумма конечного числа элементов ряда: %lf \n", sum);
    break;
  default:
    printf("Неправильный ввод");
  }
  printf("Проверка: %lf", sin(x));
  return 0;
}

Например, при выборе 1 и вводе х=21 с точностью 0.01 выводится отрицательное число с целой частью больше 0. В чем может быть проблема?


Ответы (1 шт):

Автор решения: AlexGlebe

Умножать надо на -1.0 * x * x / m / ( m + 1 ) и потом прибавлять к m число 2. Или как в вашем коде на -1.0 * x * x / ((2 * m) * (2 * m + 1));. Тогда к числу m нужно добавлять единичку. А не везде одновременно.

Решение :

for(m=1; fabs(y)>=E; ++m)
→ Ссылка