TuringQi 2021-09-16 08:11 采纳率: 88.2%
浏览 153
已结题

使用函数求余弦函数的近似值

找了好久不知道什么问题,运行结果是-1.#IND00
百度过说是有分母0的情况出现,我分析了好久也没看出来哪里会可能这样
题目如下

img

img

答案注释了一些

double funcos( double e, double x ){
    double f=1.0; //cosx 当前值,因为第一项不论x给多少衡为1,初始给f的值1
    int i=1  ; //i是计数变量,从第二项开始算1
    while(fabs(x-f)>e){ //精度不够
        int jiecheng=1 , p=2*i; //jiecheng代表阶乘运算后的值 原谅我词穷不会起名字,p是代表阶乘的起点,找规律得出应该是2倍i
        while(p!=0){
            jiecheng*=p;
            p--;
        }
        f+=pow(-1,i)*pow(x,2*i)/jiecheng; //cosx 累加,每循环一次就新加一项,三部分组成:正负号、分子、分母
        i++;
    }
    return f;
}

  • 写回答

2条回答 默认 最新

  • joel_1993 2021-09-16 08:40
    关注

    你这个程序太乱了。
    首先不能用x-f作为判断依据啊,x是自变量,f是因变量,完全不是一个事情;你的x如果输入1,那不是x-f=0,你得到的f就是1,cos(1)=1,不可能的事情。
    然后,阶乘可能很大,用double变量会好些;我给你把误差设置为截断的,就是每次需要加的那个式子

    #include<stdio.h>
    #include<math.h>
    double funcos( double e, double x ){
        double f; //cosx 当前值,因为第一项不论x给多少衡为1,初始给f的值1
        double err, df;
        double jiecheng;
        int p;
        int i; //i是计数变量,从第二项开始算1
        f = 1.0;
        err = 1.0;
        i = 1;
        while(err>e){ //精度不够
            jiecheng=1.; 
            p=2*i; //jiecheng代表阶乘运算后的值 原谅我词穷不会起名字,p是代表阶乘的起点,找规律得出应该是2倍i
            while(p!=0){
                jiecheng*=p;
                p--;
            }
            df=pow(-1,i)*pow(x,2*i)/jiecheng; //cosx 累加,每循环一次就新加一项,三部分组成:正负号、分子、分母
            
            f+=df;
            i++;
            err = fabs(df);
        }
        return f;
    }
    int main(){
        printf("%.6f", funcos(1e-5, 1.));
    }
    

    然后我推荐的cos的自编程(也是根据你的程序改的)

    #include<stdio.h>
    #include<math.h>
    double funcos( double e, double x ){
        double f; //cosx 当前值,因为第一项不论x给多少衡为1,初始给f的值1
        double err, df, xn;
        double jiecheng;
        int p;
        int i; //i是计数变量,从第二项开始算1
        f = 1.0;
        err = 1.0;
        i = 1;
        jiecheng = 1。;
        xn = 1.;
        while(err>e){ //精度不够
            jiecheng*=(2*i-1)*(2*i);//每次乘两个数不就是(2i)!吗 【分母】 
            xn*=-x*x;//每次上面x的2i次方乘以-1的i次方就是这个【分子】 
            df = xn/jiecheng;//每次加这么多 
            f+=df;
            err = fabs(df);
            i++;
        }
        return f;
    }
    int main(){
        printf("%.6f", funcos(1e-5, 1.));
    }
    

    展开全部

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)
编辑
预览

报告相同问题?

问题事件

  • 系统已结题 9月23日
  • 已采纳回答 9月16日
  • 创建了问题 9月16日
手机看
程序员都在用的中文IT技术交流社区

程序员都在用的中文IT技术交流社区

专业的中文 IT 技术社区,与千万技术人共成长

专业的中文 IT 技术社区,与千万技术人共成长

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

客服 返回
顶部