习题5-7 使用函数求余弦函数的近似值

本题要求实现一个函数,用下列公式求cos(x)的近似值,精确到最后一项的绝对值小于e: 

cos(x)=x^{0}/0!-x^{2}/2!+x^{4}/4!-x^6/6!+...

函数接口定义:double funcos( double e, double x );

其中用户传入的参数为误差上限e和自变量x;函数funcos应返回用给定公式计算出来、并且满足误差要求的cos(x)的近似值。输入输出均在双精度范围内。

裁判测试程序样例:

#include 
#include 

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。

你可能感兴趣的:(c语言)