您所查看的帖子来源于考研论坛(bbs.kaoyan.com)
考计算机的一起来放松一下。。。呵呵 看数学看的好累,所以写了个求sin(X)值的函数。。。原理自然是求泰勒公式展开项之和
9p7df;RHG
不过很奇怪计算60°角的时候 =0.86625 和我用windows自带的计算器算出的值0.86602540378443864676372317075294一样
;g PUJW7smx P8eXq
算120°角就开始偏离正确值了 =0.866113 这个误差似乎还可以接受
v/f4I
C;u+N*q t
可是算240°角的时候就=-0.74123这个值和正确值-0.86602540378443864676372317075294就差太远了
'v]g#Y:WD a
我开始计算的项数之合为3项,后来改为6项误差有所减少,可是为7项以上误差又变大了。。如果大家有兴趣一起研究一下,是不是我没有搞清楚泰勒公式应用还有什么条件?是不是拉格朗日余项很关键?其中的那个[0,1]之间的值我随便取了个0.5这个余项好像非常××小
V'UoZA2OTH
j J
如果大家有兴趣帮我改改代码 提高一下精度[qq:13] 纯属娱乐哈不要拍砖
)g{6RcX2zl8p
#include"stdio.h"
!I;W:t&q+[L
#include "math.h"
CP
Sir9z+Zz
)Lszp(pl"YN a;b
//一个求阶乘的函数
*B&l+uAg2B0ubc8W#C
int Sub_Item(int k)
'sY5R,B]g XM
{
|&v%n2`A
Fo
int KJC = 1;
/hwKwt
for(int i = k ; i > 0 ; i-- )
S)[2w _WUU'Z
{
9P:~1@zk%X
KJC*=i;
DB+Tl0b kA
}
Bws^}`/U8X|K
^S0?t?*\!v%i CV
return KJC;
&[5\c'^|t
}
Hw:P1_3~9j3JI$L*o
-rBC2r~F-J#qOm7d5L
int _tmain(int argc, _TCHAR* argv[])
qUC3KH.d%p
{
k`w0\4W^~
//计算到第几项
\
}"F5TV?y9j
int n = 6;
{+H*s1Q3Y%~)e+Z9i
//定义角度转化后的弧度值变量
y~bY:WR'Ye
double X = 0.0;
:`
~-s}(_
//定义最终结果
_l6_Y{no
double FinalResult = 0.0;
:JA*|2@Q5p LY
-Xk0l1D_M-M-c;D)D
//定义角度值
9DJ)a&e)cd
int iDegree = 0;
g
o`K2RO
printf("输入一个角度");
w8\kx,}8wp~0dNT
//获得输入的角度值
;F3Q/?@rGo |O
scanf("%d",&iDegree);
o"~yA+} D
//换算为相应的弧度值
?+hd@XUeQ5p
X = (double)iDegree/180.0*3.14159;
5}:h$wb@xu
PP.kC5wQ
//循环累计各项之和
*z%b{~:q-`Ci4n
for(int k = 1 ; k < n ; k++)
)]*l zZt#V
{ //(-1)^(k-1)*X^(2*k-1)/(2*k-1)!
Tj b
m{6fh
FinalResult = FinalResult + (long)pow( (double)-1 , (int)( k - 1 ) ) * pow((double)X , (int)( 2 * k - 1 )) / Sub_Item( 2 * k - 1 );
4]s.h\
}G"i:|
}
s6f,S3q g+E-Z7H
L} a yj%zG
m
//求出拉格朗日余项
N^x1@a
G
O
double R2nX = (long)pow( (double)-1 , (int)( n) )*cos(0.5*X)* pow((double)X , (int)( 2 * n + 1 ))/Sub_Item(2*n+1);
$J(d*ym/StwS
//求出最终结果
'c%G!on0Uy
FinalResult = FinalResult + R2nX;
7EsF/unY0E1Wy
3gDU0a#HY+Bw
printf("sin%d = %f",iDegree,FinalResult);
YQ4^.cv^bvnY
getchar();