| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 772 人关注过本帖
标题:c语言求教(求π的近似值)
只看楼主 加入收藏
Smile浅笑
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2014-6-6
结帖率:0
收藏
已结贴  问题点数:20 回复次数:5 
c语言求教(求π的近似值)

#include "stdafx.h"
#include "math.h"

int main(int argc, char* argv[])
{
    int sign=1;double pi=0,n=1,term=1;
    while (fabs(term)>1e-6)
    {
        pi=pi+term;
        n=n+2;
        sign=-sign;
        term=sign/n;
    }
    pi=pi*4;
    printf("pi=%10.8f\n",pi);
    return 0;
}

亲,我是初学者。想问一下按这样的写法,整个程序大致是这个意思吗?指定sign为整型,赋初始值为1,指定双精度pi,n,term,分别赋初始值0,1,1.执行pi=pi+term(分项累加和),n=n+2确定每增一项的分母,sin=-sign则是用来控制相邻项的政府交替,term=sign/n表示公式中通项的表达,pi=pi*4表示程序执行出的结果pi/4就是所求的π的近似值,(整个程序依据公式π=1-1/3+1/5……)









还想问一下我说的int的那一行对不对

[ 本帖最后由 Smile浅笑 于 2014-6-6 15:50 编辑 ]
搜索更多相关主题的帖子: c语言 return double include 
2014-06-06 15:49
砖家的谎言
Rank: 12Rank: 12Rank: 12
等 级:禁止访问
威 望:30
帖 子:693
专家分:3898
注 册:2013-12-6
收藏
得分:7 
sign=-sign;你这个表达式是什么意思

我不是砖家,要努力成为砖家。
2014-06-06 15:53
Smile浅笑
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2014-6-6
收藏
得分:0 
回复 2 楼 砖家的谎言
控制每项正负交替
2014-06-06 15:57
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9007
专家分:53942
注 册:2011-1-18
收藏
得分:7 
π/4 = 1/1-1/3+1/5……

π = 8/(1*3) + 8/(5*7) + 8/(9*11) + ……
所以代码简化为
程序代码:
#include <stdio.h>

int main()
{
    double pi8 = 0;
    for( double base=1; base<1000000; base+=4 )
        pi8 += 1.0/base/(base+2);
    printf( "pi=%.8f\n", pi8*8 );

    return 0;
}
记住,代码越少,对别人而言可读性就越强。

但,这仍然是不对的,因为你这样算出来的精度不足小数点后面四位,怎么可以用“%.8f”?

加大循环次数可以提高精度,但无法一直精化下去,因为 double 累加时会产生误差
这个时候要用一个累加技巧,……下班了,下星期再说,先贴段代码
double StaSum( const double vals[], size_t n )
{
    double sum = 0;

    double C = 0.0;
    for( size_t i=0; i!=n; ++i )
    {
        double Y = vals[i] - C;
        double T = sum + Y;
        C = T - sum - Y;
        sum = T;
    }

    return sum;
}
2014-06-06 16:31
vvvcuu
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:12
帖 子:353
专家分:1253
注 册:2014-4-22
收藏
得分:7 
亲测,最后输出

   π=3.14159065

测试环境见本人签名.

n貌似用int就可以,  不用double就行, 当然用double也没错.

代码测试环境:  WinXP+C-Free5.0.
2014-06-08 15:08
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9007
专家分:53942
注 册:2011-1-18
收藏
得分:0 
题目要求:根据 π/4 = 1/1-1/3+1/5…… 公式求PI,精确到小数点后8位

公式变形为 π/8 = 1/(1*3) + 1/(5*7) + 1/(9*11) + ……
因此有代码
double pi8 = 0;
for( double base=1; base<=循环次数; base+=4 )
    pi8 += 1.0/base/(base+2);
printf( "pi=%.8f\n", pi8*8 );
但无论循环多少次,都不会得到正确结果,因为累加时导致精度丧失。

最先自然想到用 KahanSum 求和。
但仔细考虑后,发现并不需要KahanSum,而只需要从最小值到最大值依次累加即可减少累加时的精度损失。

以下为示意代码
#include <stdio.h>

int main()
{
    const size_t cnt = 1000000000; // 1e-9

    { // 原始算法
        double pi8 = 0;
        for( double base=1; base<=cnt; base+=4 )
            pi8 += 1.0/base/(base+2);
        printf( "pi=%.8f\n", pi8*8 );
    }

    { // 使用Kahan累加算法
        double pi8 = 0;

        double C = 0.0;
        for( double base=1; base<=cnt; base+=4 )
        {
            double Y = 1.0/base/(base+2) - C;
            double T = pi8 + Y;
            C = T - pi8 - Y;
            pi8 = T;
        }
        printf( "pi=%.8f\n", pi8*8 );
    }

    { // 反向累加
        double pi8 = 0;
        for( double base=cnt/4*4+1; base>0; base-=4 )
            pi8 += 1.0/base/(base+2);
        printf( "pi=%.8f\n", pi8*8 );
    }

    return 0;
}

输出为:
pi=3.14159264 --- (最后一位是错误的)
pi=3.14159265
pi=3.14159265
2014-06-09 11:12
快速回复:c语言求教(求π的近似值)
数据加载中...
 
   



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

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