急!!做STITP 编程遇到问题 求高手解释下
由于用C51编程 没有sin cos asin这类库函数 就自己用麦克劳林展开编了个程序但是运行的时候后有些值不精确 劳烦看一下下面的程序
--------------------------------------------------
#include "stdio.h"
#define pi 3.14159265358979323846
--------------------------------------------阶乘n!
extern unsigned long jiec(int m)
{ int i,s=1;
if(m<=0) s=1;
else
for(i=1;i<=m;i++) s=s*i;
return(s);
}
----------------------------------------二级阶乘n!!
extern unsigned long jiecc(int m)
{
int i,s=1;
if(m<=0) s=1;
else
{
for(i=m;i>=0;i=i-2)
{
if(i==0) s=s*1;
else s=s*i;
}
}
return(s);
}
-----------------------------------------------幂函数x的y次方,编译的时候老是说类型冲突,不知道为什么,就*掉了;如果哪位知道原因的话,劳烦告诉我下
/*extern double pow(double x,int y)
{
int k;
double mi=1;
for(k=0;k<y;k++) mi=mi*x;
return(mi);
}*/
double sin(double z);
double cos(double z);
double asin(double z);
-----------------------------------------------------主程序 用来查看运行结果的
int main(void)
{
int ii;
double h,A,B,xx;
xx=0.0;
for(ii=0;ii<20;ii++)
{
h=sin(xx);
A=cos(xx);
B=asin(xx);
printf("x=%f\n",xx);
printf("sinh=%f,cosA=%f,asinB=%f\n",h,A,B);
xx=xx+0.05;
}
return 0;
}
-------------------------------------------sinx定义
double sin(double z)
{
double si=0;
int fh,j;
for(j=1;j<=17;j++)
{
if((j-1)%2==0) fh=1;
else fh=-1;
si=si+fh*pow(z,(2*j-1))/jiec(2*j-1);
}
return(si);
}
-------------------------------------------cosx定义 不知道为什么sinx,cosx里的j只能取比18小的数
一大于18结果就变成#。00000d了 求解释啊。。。
double cos(double z)
{
double si=0;
int fh,j;
for(j=1;j<=17;j++)
{
if((j-1)%2==0) fh=1;
else fh=-1;
si=si+fh*pow(z,(2*j-2))/jiec(2*j-2);
}
return(si);
}
-------------------------------------------asinx定义 但是这里的j就可以取很大的值 但是结果还是不精确 哪位高手能帮忙指点下啊??
double asin(double z)
{
double si=0;
int j;
for(j=0;j<=600;j++)
si=si+pow(z,(2*j+1))*jiecc(2*j-1)/(pow(2.0,j)*(2*j+1));
while(si>2*pi) si=si-2*pi;
return(si);
}