首页 > 其他分享 >C语言求cos值和sin值

C语言求cos值和sin值

时间:2024-12-25 14:55:38浏览次数:5  
标签:cos 函数 ai double sum C语言 int include sin

学习C语言的途中,我们一定会遇到关于求sin(x)值和求cos(x)值的问题。想当初缺乏解题经验,学识短浅,求这类问题闹了不少笑话,今天用递归的思想总结一下这类问题,避免其他人踩坑。初学者第一次发博客,如果哪里写的不好希望各位大佬见谅。


例如这道题目,让我印象深刻

这道题我最初自以为是自定义阶乘函数,再调用pow函数,十几层可以解决的代码硬是给我整了几十行,关键最后还运行超时,太悲伤了。


以下是错误示范:

#include<stdio.h>
#include<math.h>  //调用数学库,用于使用pow函数和fabs()函数,用于求绝对值
int main()
{
    float x;
    float s=0.0;
    //int flat=1;
    int a=1;
    scanf("%f",&x);
    for(int i=1; ;i=i+2)
    {
        
        float ai;
        ai=(pow(x,i)/(float)jiec(i);
        
        s=s+a*ai;
        a=-a;
        
        if(fabs(ai)<=0.00001)   //用于退出循环
            break;
    }
    printf("%.3f",s);  //  打印结果

    return 0;
}
int jiec(int j)       //自定义阶乘函数
{
     int sum=1;
    for(int i=1;i<=j;i++)
       
    sum=sum*i;
    return sum;   
}

此处超时的原因可能是因为函数不断循环,不断调用pow函数从而造成超时。因此我就想能不能避免使用pow函数,解决这个问题,迭代的念头油然而生。

修改后的代码:

#include<stdio.h>
#include<math.h> //fabs()函数的使用

int main()   //求sin值
{
    int i,f=1;
    float ai,x,s=0;
    scanf("%f",&x);
    ai=x;
    for(int i=1; ;i=i+1){
        s+=ai;                                //s=s+ai
        ai=-ai*x*x/((2*i)*(2*i+1));   //ai不断正负变化,并且分子每次循环一次后都x的指数都会多2,分母为(2*i-1)!
        
        if(fabs(ai)<0.00001)  //用于循环退出,如果某一项的ai值小于规定值,则循环结束。
            break;
    }
    printf("%.3f",s);    //打印出sin值

    return 0;
}

求cos值同理就不多说什么了,代码如下(这边用了函数):

#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;
}

double funcos(double e, double x)//函数体
{
    double ai = 1;
    double sum = 0;
    int fact = 1;
    for (int i = 1; ;i++)
    {
        sum = sum + ai;
        ai = -ai * x * x / ((2*i) * (i*2 - 1));   //注意这边的括号要括起来,不然ai会越变越大,死循环
      
        if (fabs(ai) < e)
            break;
    }
    sum=sum+ai;   //看题目需求,有时候要加最后一项的ai值
    return sum;
}

这类方法的优点:运行效率快,代码行数少。

缺点:需要理解,推荐一项一项列出来写在纸上,就可以发现规律

标签:cos,函数,ai,double,sum,C语言,int,include,sin
From: https://blog.csdn.net/successwyj/article/details/144608811

相关文章

  • C语言thread_local关键字
    GNUC语言的"__thread"与C11关键字_Thread_local等效,这里只说一下C11的。#definethread_local_Thread_local//(sinceC11,thenremovedinC23)SinceC23,thread_localisitselfakeyword,whichmayalsobeapredefinedmacro,so<threads.h>nolongerprovide......
  • 图解Linux下C内存分配 by using gpt
    我们可以通过GPT来详细地图解Linux上的C内存分配。这个过程可以进一步细化,只要你愿意。最小的C代码示例以下代码使用了标准C库函数malloc分配一块内存:#include<stdlib.h>#include<stdio.h>intmain(){int*ptr=(int*)malloc(sizeof(int)*10);//分配10......
  • 数据误删?别怕!COS防误删攻略请查收
    在云存储领域,数据的安全性始终是悬在头顶的达摩克利斯之剑。长期以来,腾讯云对象存储服务(COS)一直致力于数据安全的探索和实践,以保障数据的安全性和完整性。对象存储COS准备了一份防误删攻略给大家:背景与意义在企业的日常运营中,数据的安全性面临着多种威胁,包括内部人员的误操作、......
  • Nacos1
    Nacos1.4.0启动报错解决方案|Id|Title|DateAdded|SourceUrl|PostType|Body|BlogId|Description|DateUpdated|IsMarkdown|EntryName|CreatedTime|IsActive|AutoDesc|AccessPermission||-------------|-------------|-------------|------------......
  • A5-1密码算法C语言实现
    #include<iostream>usingnamespacestd;boolx1[19]={0};//用于LFSR_1的向量boolx2[22]={0};//用于LFSR_2的向量boolx3[23]={0};//用于LFSR_3的向量boolkey[......
  • 4、数据结构与算法解析(C语言版)--栈
    栈的数据存储遵循“后进先出的规则”,这在计算机里面是非常有用的,比如word等编辑软件的"撤销"功能,就是使用栈进行实现的。1、创建项目 main.h#ifndef_MAIN_H#define_MAIN_H#include<stdio.h>#include<stdlib.h>#include<time.h>#defineTRUE1#defineFALSE0......
  • C语言中常见的数据类型及其处理方式
    1.数据类型整型整型所占字节int4字节unsignedint0~2^32-1signedint-2^31~2^31-1short2字节unsignedshort0~65535signedshort-32768~32767long8字节unsignedlong0~2^32-1signedlong-2^31~2^31-1longlong8字节unsingnedlo......
  • C语言——整型数据在内存中的存储
    整型数组在内存中的存储一、大小端存储1.大端存储(大端字节序存储)2.小端存储(小端字节序存储)>给大家一个题目,设计一个程序判断当前机器的字节序.二、原码、反码和补码1.*补充2.例题1.2.3.4.5.6.一、大小端存储1.大端存储(大端字节序存储)将一个数据的低位字节内容......
  • 【已解决】错误:未添加头文件(C语言经验分享)
    以上程序出现报错[Warning]incompatibleimplicitdeclarationofbuilt-infunction'strcspn'[Warning]incompatibleimplicitdeclarationofbuilt-infunction'strlen'cannotopenoutputfileC:Users#JlDesktoplcl1.1.1.exe:Permissiondenied[Err......
  • 【C语言】[waring]comparison between pointer and integer报错
     原因:在C语言中,指针和整型是不同的数据类型,它们之间不能直接进行比较。 改正:在arr[i]前加&取地址  [waring]comparisonbetweenpointerandinteger改正方法:1.显式类型转换(不推荐)intvalue=10;int*ptr=NULL;if((int)ptr==value){}这里if((int)ptr......