| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1800 人关注过本帖
标题:关于求∏的值。。。
只看楼主 加入收藏
LEED
Rank: 2
等 级:论坛游民
帖 子:75
专家分:43
注 册:2009-8-26
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:14 
关于求∏的值。。。
#include<stdio.h>
# include<math.h>
void main()
{
    long s ;
    long double n,t,pi;
    t=1;pi=0;n=1.0;s=1;
    while(fabs(t)>1e-6)
    {
        pi=pi+t;n=n+2;s=-s;t=s/n;
    }
    pi=pi*4;
    printf("pi=%10.6f\n",pi);
}   
得出
图片附件: 游客没有浏览图片的权限,请 登录注册

如果把long改为int long double改为float就会得到3.141594.。
这是为什么呢。。有点不明白。。望高手解答一下。。
我又用for 编了一个
#include<stdio.h>
#include<math.h>
void main()
{
    int s;
    float n,t,pi;
    for(t=1,pi=0,n=1,s=1;fabs(t)>1e-6;pi=pi+t,n=n+2,s=-s,t=s/n)
    continue;
    pi=pi*4;
    printf("pi=%10.6f\n",pi);
}   
    为什么输出为3.141594而不是3.141593
很费解。。

[ 本帖最后由 LEED 于 2009-10-2 11:37 编辑 ]
搜索更多相关主题的帖子: include double long 
2009-10-02 10:50
m456m654
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:3
帖 子:783
专家分:2806
注 册:2009-9-17
收藏
得分:0 
看起来像是数据溢出。
2009-10-02 11:04
LEED
Rank: 2
等 级:论坛游民
帖 子:75
专家分:43
注 册:2009-8-26
收藏
得分:0 
回复 2楼 m456m654
我也觉得是。。
能详细的解释一下吗?初学C。。有点不明白。。
2009-10-02 11:11
m456m654
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:3
帖 子:783
专家分:2806
注 册:2009-9-17
收藏
得分:0 
我也说不准,不过long double的有效数字是18-19位,其数值范围更是大的惊人。如果用long double去表示一个整数部分只有一位的数,有点大材小用。但是表示的结果还不对,只能猜测中间运算的时候是不是哪一步不妥善。我也不是很明白。书上说:在初学阶段,对long double型用的较少,以此不做介绍。读者只要知道有此类型即可。那它的意思就是说,不到万不得已,别用long double了,可能用起来还有什么说明或考虑因素吧。
收到的鲜花
  • LEED2009-10-02 11:28 送鲜花  5朵  
2009-10-02 11:20
LEED
Rank: 2
等 级:论坛游民
帖 子:75
专家分:43
注 册:2009-8-26
收藏
得分:0 
回复 4楼 m456m654
呵呵。。还是谢谢你哦。。
为什么我输出的结果是3.141594而不是3.141593.。
2009-10-02 11:27
m456m654
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:3
帖 子:783
专家分:2806
注 册:2009-9-17
收藏
得分:0 
应该是你在用循环求π的近似值时精确度不够,你把while(fabs(t)>1e-6) 改为while(fabs(t)>1e-8),就如愿以偿了。

2009-10-02 11:30
LEED
Rank: 2
等 级:论坛游民
帖 子:75
专家分:43
注 册:2009-8-26
收藏
得分:0 
回复 6楼 m456m654
还是不行啊。。。。还是那个结果。。
2009-10-02 11:33
m456m654
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:3
帖 子:783
专家分:2806
注 册:2009-9-17
收藏
得分:12 
回复 7楼 LEED
#include<stdio.h>
#include<math.h>
void main()
{
    int s ;
    double n,t,pi;
    t=1;pi=0;n=1.0;s=1;
    while(fabs(t)>1e-6)
    {
        pi=pi+t;n=n+2;s=-s;t=s/n;
    }
    pi=pi*4;
    printf("pi=%10.6f\n",pi);
}   
试试这个。上边的我又试了试,也不行。可能是float的有效位数问题,1e-8,小数点后8位,对于float来说简直就认为是零,所以float下就成死循环了。
改用double,不够运行时间稍长。你运行后,安静的等上3. 4秒钟,就出结果了。别急着按回车,小心死机。
2009-10-02 11:57
LEED
Rank: 2
等 级:论坛游民
帖 子:75
专家分:43
注 册:2009-8-26
收藏
得分:0 
回复 8楼 m456m654
呵呵。。。能得出结果。。。不过是3.141591.。你运行的是3.141593?
可能和编译工具有关吧。。我用的是TC&C++3.0
2009-10-02 13:02
m456m654
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:3
帖 子:783
专家分:2806
注 册:2009-9-17
收藏
得分:0 
我的到1e-8后可以得到3.141593,我用的是TC2.0 呵呵
2009-10-02 13:11
快速回复:关于求∏的值。。。
数据加载中...
 
   



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

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