在C语言中要使用三角函数的话,首先备哪燃要包含math.h头文件。
成都创新互联专注于康平网站建设服务及定制,我们拥有丰富的企业做网站经验。 热诚为您提供康平营销型网站建设,康平网站制作、康平网页设计、康平网站官网定制、小程序开发服务,打造康平网络公司原创品牌,更为您提供康平网站排名全网营销落地服务。
其次,缓段自变量的值必须要以弧度为单位,括号要使用英文标点。比如,求sin(30°)的话,把度数换算为弧度,要先除以180,再仿虚乘以π。
要用以下的语句:
double x;
x=sin(30/180*3.1415926);
本质有问题。
cos(x) = x^0/0!-x^2/2!+x^4/4!-x^6/6!+……
这个公式是运用泰勒公式把函数 f(x)=cos(x) 在 x=0 点展开成多项式 ,当 n 不是很大时 ,只有 x=0 附近的数才能算出比较准确的值,而当 n 很大时 n! 也非常大 ,这时若 x1 那么 x^n 也非常大 ,如果仍采用常规措施怎么可能会扒返信对呢?不溢出才怪。
给一些提示:
1,利用函数周期性,始终保持较小的 x ;
2,如果已经求得 t = x^n/n! ,那么
x^(n+2)/(n+2)! = t * x^2 / ( (n+1)*(n+2)) ;
这样整个运算过程中就能尽量避免出现太大的值 ,并能提高效率 ,这只是个思路世耐,实春轮现时请注意细节。
顺便给个粗略的实现,仅供参考,如下:
double funcos(double e, double x)
{
int flag = 1,m = 0;
double k = 1 ,sum = 0;
x = fmod(x,2*3.1415926) ;
while( fabs(k) = e || fabs(sum) 1 ){
sum += flag*k;
k /= ( (m+1)*(m+2) / (x*x) );
m += 2;
flag = -flag;
}
return sum;
}
你的程序其他地方没有问题,printf 不同于 scanf ,会自动对精度进行扩展,所以 printf("%f",...); 可以输出 double 。
显然读者想要通过泰基宽勒展开式近似求解cos(X)
错误1:
while(-1E-7tt1E-7),应改为while(!(-1E-7tt1E-7))
错误2:double sum=1,t=1,f=1,v; ,嫌颤应改为double sum=1,t=1,f=1,v=1;
错误3:f=(-1.0)*x*x;,应改为f*=(-1.0)*x*x;
错误4: v=(i-1)*i;, v*=(i-1)*i;
最终程序为:
#includestdio.h
double cos(double x) //函数定义和形参说明
{
double sum=1,t=1,f=1,v=1; //t由分子分母两部分构成,f表示分子,v表示分母,r表示符号
int i=2;
while(!(-1E-7tt1E-7))
{
f*=(-1.0)*x*x;
v*=(i-1)*i;
i+=2;
t=(f/v);
sum+=t;
}
return(sum);
}
void main()
{
double x,a;
printf("搏者亮x=");
scanf("%lf",x);
a=cos(x);
printf("cos(%lf)=%lf\n",x,a);
}