本题要求实现一个函数,用下列公式求cos(x)的近似值,精确到最后一项的绝对值小于e:
函数接口定义: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
读题抓出关键
1、最后一项的绝对值小于e,看到绝对值联想使用fabs函数
2、输入输出均在双精度(double)范围内
分析公式看规律
1、一正一负,很自然的想到设立flag
2、x的幂为0、2、4、6...初步考虑用循环迭代
解题代码
double funcos( double e, double x )
{
int i = 1;
int flag = 1;//设立flag实现一正一负
double value = 1;//设立问题1,想想为什么将第一项设为1(后面有解答)
double sum = 0;
double denominator = 2;//设立问题2,想想为什么将分母设为2
while(fabs(value) >= e)//利用fabs函数实现绝对值的判断
{
sum = sum + value;//明白问题1、2即可明白此步骤
flag = -flag;
value = pow(x,i*2)/denominator*flag;
i++;
denominator = (i*2)*(i*2-1)*denominator;
}
sum = sum + value;//设立问题3,为什么还要做这一步?
return sum;
}
问题解答
问题1:因为0的任何次方除以0的阶乘都为1,故可直接将第一项设置成1,也方便后面fabs的判断。为什么方便fabs的判断?若将第一项值设置成0,fabs的绝对值为0,0必然小于e,显然用fabs判断会出错。(当然此题还可用其他方法,在这里是想让大家了解fabs函数用法)
问题2:第二项的分母为2。
问题3:因为while循环时最后的结果sum没有加上最后一次的value。