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

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

cos(x)=x0​​/0!x2​​/2!+x4​​/4!x6​​/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
", x, funcos(e, x));

    return 0;
}

/* 你的代码将被嵌在这里 */
 

输入样例:

0.01 -3.14
 

输出样例:

cos(-3.14) = -0.999899


 1 /*个人感觉这道题可以从三个方面进行考虑,通过对比每一项可以看到,
 2 每一项与上一项的区别在于多了一个x*x,多除了一个m*(m-1),以及变号(即乘上-1)*/
 3 double funcos(double e,double x){
 4     //初始sum值设为1,因为第一项求极限值为1
 5     double sum=1.0;
 6     //第一项为1小于e,计算第二项,幂数为m=2.除数也为2*1=2;
 7     double m=2;
 8     double k=2;
 9     //用temp存储每一项的绝对值
10     double temp=x*x;
11     sum-=temp/k;
12     //刚开始计算得到的temp是第二项的值,如果第二项的值大于e则执行以下流程
13     for(m=4;fabs(temp/k)>e;m+=2){
14         temp=temp*x*x;
15         k=k*(-1)*m*(m-1);
16         sum-=temp/k;
17     }
18     return sum;
19 }
20 
21 /*
22 double funcos( double e, double x ){
23     double tmp1=1,tmp2=1,tmp3=1,sum=1;
24     int i,k;
25     k=-1; 
26     for(i=2;tmp1>e;i+=2){
27         tmp2 = tmp2*x*x;//分子
28         tmp3 = tmp3*i*(i-1);//分母
29         sum = sum + k*tmp2/tmp3;//转换各项的符号再相加
30         tmp1=tmp2/tmp3;//每一项的绝对值
31         k=-k;//换号
32     }
33     return sum;
34 }
35 */
原文地址:https://www.cnblogs.com/samgue/p/13196779.html