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

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

找了好久不知道什么问题,运行结果是-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 16: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月24日
  • 已采纳回答 9月16日
  • 创建了问题 9月16日

悬赏问题

  • ¥100 set_link_state
  • ¥15 虚幻5 UE美术毛发渲染
  • ¥15 CVRP 图论 物流运输优化
  • ¥15 Tableau online 嵌入ppt失败
  • ¥100 支付宝网页转账系统不识别账号
  • ¥15 基于单片机的靶位控制系统
  • ¥15 真我手机蓝牙传输进度消息被关闭了,怎么打开?(关键词-消息通知)
  • ¥15 装 pytorch 的时候出了好多问题,遇到这种情况怎么处理?
  • ¥20 IOS游览器某宝手机网页版自动立即购买JavaScript脚本
  • ¥15 手机接入宽带网线,如何释放宽带全部速度