标题:关于求圆周率PI的近似值的问题(两种算法精度相差很大,想知道是由哪一步引 ...
取消只看楼主
killah
Rank: 2
等 级:论坛游民
帖 子:55
专家分:11
注 册:2013-2-4
结帖率:62.5%
已结贴  问题点数:10 回复次数:3 
关于求圆周率PI的近似值的问题(两种算法精度相差很大,想知道是由哪一步引起的)
用π/4=1-1/3+1/5-1/7+.....的公式求π的近似值
算法一和算法二精度相差很大,是不是因为算法一中pi=pi+t,而算法二中pi=pi+t1+t2,由于算法二是两个值一起加在pi原先的值上,所以导致误差更大?

算法一:(用S表示符号位,没加上一个新的值符号变化一次),此法得到结果为3.141594
#include<stdio.h>
#include<math.h>
void main()
{
    int n;
    float pi,t1,t2;
    n=1;
    pi=1;
    t1=1;
    t2=1;
   
    while(fabs(t2)>=1e-6)
    {
        n=n+2;
        t1=-t1;
        t2=t1/n;
        pi=pi+t2;
    }
    pi=4*pi;
    printf("pi is %f",pi);
}

算法二:每循环一次负正两项一起加,此法得到结果是3.141802
#include<stdio.h>
#include<math.h>
void main()
{
    int n;
    float pi,t1,t2;
    n=1;
    pi=1;
    t2=1;
    while(fabs(t2)>=1e-6)
    {
        t1=-1.0/(n+2);
        t2=1.0/(n+4);
        pi=pi+t1+t2;
        n=n+4;
    }
    pi=4*pi;
    printf("pi is %8.6f",pi);
}
搜索更多相关主题的帖子: include 圆周率 
2013-02-16 16:55
killah
Rank: 2
等 级:论坛游民
帖 子:55
专家分:11
注 册:2013-2-4
得分:0 
回复 2楼 cnfarer
好像的确不同,不过好像循环终止条件引起的误差不会这么大啊?
2013-02-17 20:45
killah
Rank: 2
等 级:论坛游民
帖 子:55
专家分:11
注 册:2013-2-4
得分:0 
回复 3楼 爱学习的我
算法顺序没有弄错哦~我又用VC试了一下以下两个程序:第一个程序得到的值是0.5,第二个程序得到的值是0;我也查了一下书,教材上的话如果是下面第一段程序的情况也会给t赋值为1.0;会不会有些编译器像处理这类问题的时候会把结果处理成浮点数,而有些编译器会处理成整型?然后最好是定义成1.0的形式?不过这好像不是求圆周率那两段程序造成误差的原因

#include<stdio.h>
void main()
{float t;
int n;
t=1;n=2;
t=t/n;
printf("%f",t);
}

#include<stdio.h>
void main()
{float t;
t=1/2;
printf("%f",t);
}
2013-02-17 20:56
killah
Rank: 2
等 级:论坛游民
帖 子:55
专家分:11
注 册:2013-2-4
得分:0 
回复 6楼 爱学习的我
嗯,对的,下次我也要注意一下,FLOAT类型的就给赋成小数形式
2013-02-19 18:36



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-398658-1-1.html




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

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