本题要求实现一个函数,用下列公式求cos(x)的近似值,精确到最后一项的绝对值小于e:
cos(x)=x^0 /0!−x2/2!+x4/4!−x^6/6!+⋯
函数接口定义:
double funcos( double e, double x );
其中用户传入的参数为误差上限e和自变量x;函数funcos应返回用给定公式计算出来、并且满足误差要求的cos(x)的近似值。输入输出均在双精度范围内。
裁判测试程序样例:
#include <stdio.h>
#include <math.h>
double funcos( double e, double x );
int main()
{
double e, x;
scanf("%lf %lf", &e, &x);
printf("cos(%.2f) = %.6f\n", x, funcos(e, x));
return 0;
}
/* 你的代码将被嵌在这里 */
输入样例:
0.01 -3.14
输出样例:
cos(-3.14) = -0.999899
题解:
double funcos( double e, double x )
{
//这边把第一项的值直接赋值给变量,循环时从第二项开始算的
double j=1.0; //分子的次方 (初值为1,因为第一项分子最后结果为1)
int t=-1; //中间变量(实现一正一负) (由于第一项是正的,所以这里应当为负的,因为循环从第二项开始算)
double sum=1.0; //cos近似值 (初值为1,因为第一项的值最后结果为1)
int s=1; //循环变量
double p=1; //分母阶乘 (初值为1,因为第一项分母的阶乘为1)
double m=j/p; //每一项的值(不含符号)
do
{
p=p*s*(s+1); //分母阶乘 (公式的由来:一步一步验算,跟初值s有很大的关系)
j=j*x*x; //分子x的次方
sum=sum+j/p*t; //总和
m=j/p; //每一项的值
t=-t; //每次循环快结束的时候t要变号
s+=2; //循环变量加2
}
while(m>=e); //当每一项的值大于误差时循环
return sum; //返回sum给funcos
}