With my life to fight 2023-04-10 09:50 采纳率: 100%
浏览 72
已结题

用c求sin的近似值

【问题描述】

给定一个精度值e,用下列公式计算sin(x)的近似值,要求前后两次迭代之差的绝对值小于e,给出相应的最小迭代次数n和最后一次计算的sin(x)值。

sin x = x - x3/3! + x5/5! - x7/7! + ... + (-1)n-1x2n-1/(2n-1)!

其中x为弧度,n为正整数。

【输入形式】

从控制台输入x( (0<x<=10) )和e( x>e>0 )的值,以一个空格分隔。

【输出形式】

输出迭代次数n和最后一次计算的sin(x)的值(以一个空格分隔,并且输出sin(x)时要求小数点后保留9位有效数字)。

【样例输入】

1.23 0.0000001

【样例输出】

7 0.942488802

【样例说明】

输入的x为1.23,精度值e为0.0000001。当n为5时,利用上述公式计算sin(x)的值为0.942489044,n为6时计算的结果为0.942488800,两结果之差的绝对值约为0.000000244,大于要求的精度值0.0000001,故需要继续迭代计算。当n为7时计算的结果为0.942488802,与n为6的计算结果之差的绝对值约为0.000000002,小于要求的精度值,所以最小迭代次数应为7,最后一次计算的sin(x)的值为0.942488802(小数点后保留9位有效数字)。

注意:
(1) 为保证计算精度,请使用double数据类型保存计算数据。
(2) 应至少迭代两次,即:n>=2。

n=7时测试数据与我的结果数据差了一点点,思路和其他测试数据都一样,不知道为啥。

#include<stdio.h>
#include<math.h>
int f(int n)
{
    int i,sum=1;
    for(i=1;i<=n;i++)
    {
        sum*=i;
    }
    return sum;
}
int main()
{
    double x,e,x2,x3,x4;
    scanf("%lf %lf",&x,&e);
    x2=x;
    x3=1;
    x4=x;
    int i,j,flag=-1,cnt=1;
    for(i=2;x3>=e;i++)
    {
        x3=x2;
        x4*=x*x;        
        x2=x2+x4*flag/f((2*i-1));
        flag=-flag;
        x3=fabs(x2-x3);
        cnt++;
    
    } 
    printf("%d %.9lf",cnt,x2);
    return 0;
}

img

  • 写回答

3条回答 默认 最新

  • a5156520 2023-04-10 10:39
    关注

    我这里把函数f()里面sum的数据类型改为double,结果就和题目所给出的一致了,所以推测应该是求阶乘这里的原因。

    修改如下:

    参考链接:


    #include<stdio.h>
    #include<math.h>
    double f(int n)
    {
        int i;
        double sum=1; 
        for(i=1;i<=n;i++)
        {
            sum*=i;
        }
        return sum;
    }
    int main()
    {
        // https://blog.csdn.net/ZHangFFYY/article/details/53043885
        // https://www.jianshu.com/p/67d55d7b1480
        double x,e,x2,x3,x4;
        scanf("%lf %lf",&x,&e);
        x2=x;
        x3=1;
        x4=x;
        int i,j,flag=-1,cnt=1;
        for(i=2;x3>=e;i++)
        {
            x3=x2;
            x4*=x*x;        
            x2=x2+x4*flag/f((2*i-1));
            flag=-flag;
            x3=fabs(x2-x3);
            cnt++;
        
        } 
        printf("%d %.9lf",cnt,x2);
        return 0;
    }
    

    img

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

报告相同问题?

问题事件

  • 系统已结题 4月18日
  • 已采纳回答 4月10日
  • 创建了问题 4月10日

悬赏问题

  • ¥15 如何让企业微信机器人实现消息汇总整合
  • ¥50 关于#ui#的问题:做yolov8的ui界面出现的问题
  • ¥15 如何用Python爬取各高校教师公开的教育和工作经历
  • ¥15 TLE9879QXA40 电机驱动
  • ¥20 对于工程问题的非线性数学模型进行线性化
  • ¥15 Mirare PLUS 进行密钥认证?(详解)
  • ¥15 物体双站RCS和其组成阵列后的双站RCS关系验证
  • ¥20 想用ollama做一个自己的AI数据库
  • ¥15 关于qualoth编辑及缝合服装领子的问题解决方案探寻
  • ¥15 请问怎么才能复现这样的图呀