| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 24663 人关注过本帖
标题:c语言 利用泰勒级数计算sinx的值
只看楼主 加入收藏
yogurtmai
Rank: 1
等 级:新手上路
帖 子:15
专家分:0
注 册:2016-10-12
结帖率:50%
收藏
已结贴  问题点数:20 回复次数:12 
c语言 利用泰勒级数计算sinx的值
利用泰勒级数计算sinx的值,要求最后一项的绝对值小于,并统计出此时累加了多少项。请用“利用前项来计算后项”的方法计算累加项,不要使用pow函数编写程序


程序的运行结果示例1:
Input x:
3↙
sin(x)=0.141,count=9

程序的运行结果示例2:
Input x:
10↙
sin(x)=-0.544,count=18


输入格式: "%f"

输出格式:
输入提示信息:"Input x:\n"
输出格式:"sin(x)=%.3f,count=%d\n"
为避免出现格式错误,请直接拷贝粘贴题目中给的格式字符串和提示信息到你的程序中。



#include<stdio.h>
#include<math.h>
int f1(int n)
{
    int a ,b=1;
    for(a=1;a<=n;a++)
    {
        b=b*a;
    }
    return b;
}
 main()
{
    int d=1,c=3;
   
    float a,b=0,i,e;
    printf("Input x:\n",a);
    scanf("%f",&a);
    e=a*a*a;
   
    b=a;
    do
    {
        
        i=e/f1(c);
        if((d+1)%2==0)
        i=-i;
        b=b+i;
        d++;
        e=e*a*a;
        c=c+2;
    }while(fabs(i)>=1e-5);
    printf("sin(x)=%.3f,count=%d\n",b,d);
}



用例测试结果                    运行时间    占用内存    提示    得分
用例1未通过    --    0kb            运行时间超出限制                     0
用例2未通过    --    0kb            运行时间超出限制                     0
搜索更多相关主题的帖子: 编写程序 include 提示信息 绝对值 字符串 
2016-11-03 22:52
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9025
专家分:54030
注 册:2011-1-18
收藏
得分:10 
题主,当你提交代码前,有没有先用题目中给出的测试用例试试?只要你运行一下就能看出,因为int溢出而死循环。

程序代码:
// sin(x) = sigma( (-1)^n * x^(2n+1) / (2n+1)! )
// f(n+1) = f(n) * (-x*x)/((2n+2)*(2n+3))

#include <stdio.h>

int main( void )
{
    double x;
    printf( "Input x:\n" );
    scanf( "%lf", &x );

    double result = x;
    int count = 1;
    double item = x;
    do
    {
        item *= -x*x / (2*count) / (2*count+1);
        result += item;
        ++count;
    }
    while( item>=+1e-5 || item<=-1e-5 );

    printf( "sin(x)=%.3f,count=%d\n", result, count );
    return 0;
}

2016-11-04 09:48
yogurtmai
Rank: 1
等 级:新手上路
帖 子:15
专家分:0
注 册:2016-10-12
收藏
得分:0 
回复 2楼 rjsp
对啊!我就发现是死循环,但我不知道是哪里溢出了,如果在我的代码上改应该怎么改呢?
2016-11-04 14:42
yogurtmai
Rank: 1
等 级:新手上路
帖 子:15
专家分:0
注 册:2016-10-12
收藏
得分:0 
回复 3楼 yogurtmai
是不是这样???




#include<stdio.h>
#include<math.h>
double f1(double n)
{
    double a ,b=1;
    for(a=1;a<=n;a++)
    {
        b=b*a;
    }
    return b;
}
 main()
{
    int d=1;
   
    double a,b,i,e,c=3;
    printf("Input x:\n",a);
    scanf("%lf",&a);
    e=-a*a*a;
   
    b=a;
    do
    {
        
        i=e/f1(c);
        b=b+i;
        d++;
        e=-(e*a*a);
        c=c+2;
    }while(fabs(i)>=1e-5);
    printf("sin(x)=%.3f,count=%d\n",b,d);
   


}
2016-11-04 14:44
yogurtmai
Rank: 1
等 级:新手上路
帖 子:15
专家分:0
注 册:2016-10-12
收藏
得分:0 
回复 2楼 rjsp
为什么我把scanf("%lf",&a);改为scanf("%f",&a);输出的答案就错了?
把它改为scanf("%lf",&a);就对了?
我输进去的数明明就是 3 啊
3 的float型和double型有什么区别??
2016-11-04 14:48
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:10 
图片附件: 游客没有浏览图片的权限,请 登录注册

虽然能运算,但是运算数据太大还是会导致数据溢出的

我把这个程序改进一下就能解决问题了

程序代码:
#include<stdio.h>
#include<math.h>
#define Pi 3.1415926//***************************//
double f1(double n)
{
    double a ,b=1;
    for(a=1;a<=n;a++)
    {
        b=b*a;
    }
    return b;
}

 main()
{
    int d=1;
    
    double a,b,i,e,c=3;
    printf("Input x:\n",a);
    scanf("%lf",&a);
    a=fmod(a,Pi);//fmod函数是求a与Pi整除的余数,加了这个便没有数据溢出了
    e=-a*a*a;
    
    b=a;
    do
    {
        
        i=e/f1(c);
        b=b+i;
        d++;
        e=-(e*a*a);
        c=c+2;
    }while(fabs(i)>=1e-5);
    printf("sin(x)=%.3f,count=%d\n",b,d);
    


}

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2016-11-04 15:21
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9025
专家分:54030
注 册:2011-1-18
收藏
得分:0 
以下是引用yogurtmai在2016-11-4 14:48:37的发言:

为什么我把scanf("%lf",&a);改为scanf("%f",&a);输出的答案就错了?
把它改为scanf("%lf",&a);就对了?
我输进去的数明明就是 3 啊
3 的float型和double型有什么区别??
输入double,用"%lf";输入float,用"%f"
输出的话,随便
2016-11-04 15:26
yogurtmai
Rank: 1
等 级:新手上路
帖 子:15
专家分:0
注 册:2016-10-12
收藏
得分:0 
回复 7楼 rjsp
要怎么改才可以让输入定义成float也可以顺利输出答案?? 题目要求的输入格式是“%f”
2016-11-04 20:36
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9025
专家分:54030
注 册:2011-1-18
收藏
得分:0 
回复 8楼 yogurtmai
将所有的double换成float,同时将所有的%lf换成%f
2016-11-04 20:55
yogurtmai
Rank: 1
等 级:新手上路
帖 子:15
专家分:0
注 册:2016-10-12
收藏
得分:0 
回复 6楼 九转星河
图片附件: 游客没有浏览图片的权限,请 登录注册


为什么我在VC上运行的答案和你的不一样??
2016-11-04 21:53
快速回复:c语言 利用泰勒级数计算sinx的值
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.019436 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved