Разложить sin и cos в ряд Тейлора - C (СИ)
Формулировка задачи:
Помогите с задачей. Необходимо разложить sin и cos в ряд Тейлора. Программа работает только для промежутка [-П/4;П/4]. Подскажите как дописать для остальных х(я понимаю, что разница в начальных значениях и знаках, но реализовать не выходит).
#define _USE_MATH_DEFINES
#include <conio.h>
#include <stdio.h>
#include <math.h>
void main(){
double x,e;
printf("vvedite x,e \n");
scanf("%lf %lf",&x,&e);
int n,f=0,s=1;// s-знак, f-функция sin или cos, n-число вхождений периода(в х)
//сносим x на промежуток [-Pi/4,Pi/4]
//1
if(x<0)
{x=-x; s=-s;}
//2
if(x>=M_PI*2)
{n=x/(2*M_PI); x-=2*M_PI*n; f=0;}
//3
if(x>=M_PI)
{x=2*M_PI-x; s=-s;f=0;}
//4
if(x>=(M_PI/2))
{x=M_PI-x; f=0;}
//5
if(x>=M_PI/4)
{x=M_PI/2-x; f=!f;}
if (f==0){
int i = 1;
double sin=x,p=x,q=1,l=x; // начальные условия: p-числитель, q-знаменатель, l-член ряда
while(l>=e){
i+=2;
s=-s;
double x2=x*x;
p*=x2;
q/=(i-1)*i;
l=s*p*q;
sin+=l;
}
printf("sin=%lf",sin);
}
//else
//?
getch();
}Решение задачи: «Разложить sin и cos в ряд Тейлора»
textual
Листинг программы
#include <stdio.h>
#include <stdlib.h>
#define PI 3.1415926535897932384626433832795
float myFabs(float x){
return x>0?x:-x;
}
float mySin(int nx,float e){
float y,y0,a,b,x;
int n;
x=(nx%360)*PI/180;
for(y=0,a=x,b=n=1;;){
if(myFabs(y0=a/b)<e)
break;
y+=(n&1?1:-1)*y0;
a*=x*x;
b*=(2*++n-1)*(2*n-2);
}
return y;
}
int main(){
float e;
int x;
printf("vvedite x: \n");
scanf("%d",&x);
printf("vvedite e: \n");
scanf("%f",&e);
printf("sin(%d)=%f\n",x,mySin(x,e));
system("pause");
return 0;
}
Объяснение кода листинга программы
- Включаем необходимые заголовочные файлы
- Определяем константу PI с помощью математической константы 3.1415926535897932384626433832795
- Объявляем функцию myFabs(float x), которая возвращает абсолютное значение числа x
- В функции mySin(int nx,float e) объявляем переменные y, y0, a, b, x, n
- Вычисляем значение x в радианах, используя формулу (nx%360)*PI/180
- Задаем начальные значения для y, a и b равными x
- Начинаем цикл, который будет выполняться до тех пор, пока абсолютное значение y0 меньше заданной точности e
- В каждой итерации цикла прибавляем к y значение y0, умноженное на (n&1?1:-1)
- Умножаем a на xx и b на (2n-1)(2n-2)
- Увеличиваем значение n на 1
- После завершения цикла возвращаем значение y
- В функции main() запрашиваем у пользователя ввод значения x и e
- Вызываем функцию mySin(x,e) и выводим результат на экран
- Ждем нажатия клавиши пользователем с помощью system(
pause) - Возвращаем 0, чтобы указать, что программа успешно завершилась