sinxのテイラー展開について

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
ryuks

sinxのテイラー展開について

#1

投稿記事 by ryuks » 9年前

こんにちは。
今私はsinxをテイラー展開するプログラムを作ろうとしています。
(展開は6次まで、0°から10°ずつ値を求める)
visual studio 2012 を使っています。
コンパイルエラーも起きず、どこが間違っているのか分かりません。
実行してみたところ、 sin0°からsin350°まで全て0となってしまいます。
どなたか修正案を教えてください。

コード:

 #include "stdafx.h"
#include<math.h>
double factorial(int a);

int main()
{
	int n,x;
	double s,i,r;

	printf("nの値は?\n");
	scanf_s("&d",&n);

	for(x=0;x<=350;x+=10)
	{
		r=3.14*x/180;
		s=0.0;
		for(i=1;i<=n;i++)
		{
			s+=(double)pow(-1,i-1)*pow(r,2*i-1)/factorial(2*i-1);
		}
		printf("sin%d° =%f \n",x,s);
	}
return(0);
}

double factorial(int a)
{
	int i,n;
	n=1;
	for(i=1;i<=a;i++)
	{
		n*=i;
	}
	return(n);
}

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: sinxのテイラー展開について

#2

投稿記事 by みけCAT » 9年前

とりあえず、11行目のフォーマット指定子がおかしいので、nに値が書き込まれず、
17行目で未初期化の自動変数の値(不定)を使用して未定義動作になりますね。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

ryuks

Re: sinxのテイラー展開について

#3

投稿記事 by ryuks » 9年前

ご指摘ありがとうございます!
凡ミスでしたね・・・

しかし新たな問題が出てきてしまいました。
一応値は表示されるようになりました。
↓実行結果です。
nの値は?
6
sin0° =0.000000
sin10° =0.173561
sin20° =0.341854
sin30° =0.499770
sin40° =0.642516
sin50° =0.765760
sin60° =0.865760
sin70° =0.939481
sin80° =0.984685
sin90° =1.000000
sin100° =0.984961
sin110° =0.940024
sin120° =0.866553
sin130° =0.766777
sin140° =0.643719
sin150° =0.501107
sin160° =0.343254
sin170° =0.174918
sin180° =0.001150
sin190° =-0.172881
sin200° =-0.342078
sin210° =-0.501617
sin220° =-0.647168
sin230° =-0.775137
sin240° =-0.882933
sin250° =-0.969280
sin260° =-1.034581
sin270° =-1.081358
sin280° =-1.114797
sin290° =-1.143445
sin300° =-1.180082
sin310° =-1.242849
sin320° =-1.356688
sin330° =-1.555187
sin340° =-1.882919
sin350° =-2.398401

なんとなく合っているような気もしますが、少しずつおかしくなっているような・・・。
特に絶対値が1を超えてしまっているところがあります。

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: sinxのテイラー展開について

#4

投稿記事 by みけCAT » 9年前

ryuks さんが書きました:なんとなく合っているような気もしますが、少しずつおかしくなっているような・・・。
特に絶対値が1を超えてしまっているところがあります。
factorial関数のnの型をdoubleにして入力の値を大きく(12とか100に)したら精度が改善したので、
きちんとチェックしてはいないですが多分仕様ではないでしょうか?
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

ryuks

Re: sinxのテイラー展開について

#5

投稿記事 by ryuks » 9年前

そうなんですね!
丁寧に教えていただきありがとうございました。
おかげで助かりました。

閉鎖

“C言語何でも質問掲示板” へ戻る