Ряд Тейлора 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)