仕組みとプログラムの構成自体も概ね理解し組むことが出来たのですが答えが微妙に合いません。
/************************************/
/* プログラミング演習レポート#00 */
/* 【 ここにレポートの題目を書く 】 */
/* 学籍番号: */
/* 作成者:*/
/* 作成日:2014/05/20 */
/************************************/
/************************************************
ヘッダー、定義・マクロ
*************************************************/
#include <stdio.h>
#include <math.h>
#define PI 3.141592653589793
/************************************************
プロトタイプ宣言
*************************************************/
int menu(void);
void msin(void);
void mcos(void);
void mexp(void);
double macsin(double rad, int n);
double maccos(double rad, int n);
double macexp(double x, int n);
/************************************************
メイン
*************************************************/
int main( ) {
int num;
// setbuf(stdout,0);//msPEwb2Kの制限:main関数の最初の実行文の前に置く
do{
switch( num = menu() ){
case 1:
msin();
break;
case 2:
mcos();
break;
case 3:
mexp();
break;
case 4:
printf("終了します\n");
break;
default:
printf("1~4の半角数字を入力してください\n");
}
}while(num != 4);
}
/************************************************
メニュー
*************************************************/
int menu(void){
int n;
printf("-----------------------\n"
" 1:sine 関数 \n"
" 2:cosine 関数 \n"
" 3:exponetial 関数 \n"
" 4:終了 \n"
"-----------------------\n");
scanf("%d", &n);
return n;
}
/************************************************
sin関数 出力
*************************************************/
void msin(void){
int x;
double M, m5, m6, m7, e5, e6, e7, rad;
puts("-------------------------------------------------------------------------------------------");
puts("角度 | 標準関数の値| 5項まで 相対誤差| 6項まで 相対誤差| 7項まで 相対誤差");
puts("-------------------------------------------------------------------------------------------");
for(x = 0; x <= 180; x += 5){
rad = x * PI / 180.0;
M = sin(rad);
m5 = macsin(rad, 5);
m6 = macsin(rad, 6);
m7 = macsin(rad, 7);
if(fabs(M) > 0.01){
e5 = fabs( (M - m5) / M );
e6 = fabs( (M - m6) / M );
e7 = fabs( (M - m7) / M );
}else{
e5 = e6 = e7 = 0.0;
}
printf("%5d|%13.10f|%13.10f %9.1e|%13.10f %9.1e|%13.10f %9.1e\n", x, M, m5, e5, m6, e6, m7, e7);
}
}
/************************************************
sin関数 計算
*************************************************/
double macsin(double rad, int n){
int i, sign, bunbo;
double ans, tmp;
tmp = rad;
ans = rad;
sign = 1;
bunbo = 1;
for(i = 1; i <= n; i++){
sign *= -1; //符号反転
tmp *= rad * rad; //奇数乗(3 -> 5 -> 7..)
bunbo *= ( 2 * i + 1 ) * ( 2 * i );
ans = ans + sign*(tmp / (double)bunbo);
}
return ans;
}
次の画像が出力例として提示されたものと、私の実行結果です。
非常に近い数字が出ているのでいったい何が原因となっているのか分からず困っております。
ご教示いただけると幸いです。