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

本文介绍如何编写一个函数,使用循环迭代和fabs函数计算cos(x)的近似值,确保结果的绝对误差小于给定的e值,适用于双精度输入。函数设计包括设置标志处理正负项、初始化值和分母的确定。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本题要求实现一个函数,用下列公式求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 <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。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值