こんにちは、順を追って説明します。
1.テイラー展開したときのn番目の係数を求める。
まずsin(x)のテイラー展開なのでnが偶数の時は0です。よって奇数の時だけ考えます。
係数は {(-1) ^ ((n - 1) / 2)} / n! なのでこれをコードに落とし込みます。
ここで重要なのはn!を直接求めないことです。n!を求めると莫大な数値になり、計算に時間がかかったり
オーバーフローします。for文を使って2~nまでで割ってあげましょう。
そして、忘れてはいけない符号です。pow関数を用いて最後にかけてあげましょう。
C
1double a_n(int n)
2{
3 double answer = 1.0;
4 int i;
5
6 for(i = 2; i <= n; i++){
7 answer /= (double)i;
8 }
9 answer *= pow(-1,(n - 1) / 2);
10 return answer;
11}
2.1を用いて和を求める。
while文を用いて和を求めてあげます。修正依頼のところでも書きましたが、n番目の値の絶対値が
1.0 * 10 ^ (-8)より小さくなるまで足してあげます。1でも述べましたが、奇数の時だけを考えればいいので それを考慮してコードは以下のようになります。
C
1double my_sin(double x)
2{
3 int i = 1;
4 double answer = x;
5
6 while(fabs(a_n(2 * i + 1)) >= pow(10,-8)){
7 answer += a_n(2 * i + 1) * pow(x,2 * i + 1);
8 i++;
9 }
10 return answer;
11}
3.実際にxに角度を入れて求める。
自分で実装した関数が正しく動いているか確認するため標準ライブラリーにあるsin(x)と比較しました。
C
1int main(void)
2{
3 double data[7] = {1 / 6.0,1 / 4.0, 1 / 3.0, 1 / 2.0, 2 / 3.0, 3 / 4.0,1.0};
4 int i;
5 for(i = 0; i < 7; i++){
6 printf("%f %f %f\n",data[i],sin(M_PI * data[i]),my_sin(M_PI * data[i]));
7 }
8 return 0;
9}