| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 7463 人关注过本帖
标题:关于求圆周率PI的近似值的问题(两种算法精度相差很大,想知道是由哪一步引 ...
只看楼主 加入收藏
killah
Rank: 2
等 级:论坛游民
帖 子:55
专家分:11
注 册:2013-2-4
结帖率:62.5%
收藏
已结贴  问题点数:10 回复次数:8 
关于求圆周率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
cnfarer
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:179
帖 子:3330
专家分:21157
注 册:2010-1-19
收藏
得分:5 
循环终止条件不同

★★★★★为人民服务★★★★★
2013-02-16 17:06
爱学习的我
Rank: 2
等 级:论坛游民
帖 子:16
专家分:17
注 册:2013-1-25
收藏
得分:5 
首先,楼主的算法一算法二是不是打错位置了,第一个程序应该是算法2吧?
如果错了,且听我说,你有没有发现float类型的值赋值时应该是:
pi=1.0;
t1=1.0;
t2=1.0;

当然会出现错误的只是那个负正一起加的,为什么呢?你那个准确的程序中有一句:
t1=1.0/(n+2);
t2=1.0/(n+4);
在这里,由于出现了浮点数1.0所以计算结果默认为浮点数!!
     而不准确的程序里面是t2=t1/n;这里是两个整数计算(即使你声明的是浮点数,但你赋值的是整数),所以计算结果遵循四舍五入法则计算!导致不准确!!
2013-02-16 21:53
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
爱学习的我
Rank: 2
等 级:论坛游民
帖 子:16
专家分:17
注 册:2013-1-25
收藏
得分:0 
汗,其实我也不太知道什么。我就是给你这个建议,严格按照标准来写程序,然后再测试,这样可以更快的得到哪里有错误。你看,整数运算只会保留整数部分,这个叫什么自动转化类型。哎呀,反正写程序要写标准来
2013-02-17 21:46
killah
Rank: 2
等 级:论坛游民
帖 子:55
专家分:11
注 册:2013-2-4
收藏
得分:0 
回复 6楼 爱学习的我
嗯,对的,下次我也要注意一下,FLOAT类型的就给赋成小数形式
2013-02-19 18:36
dengjianqing
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2013-4-15
收藏
得分:0 
如果把pi改成double类型,我想精度就会一致。由于在pi=pi+t2;和pi=pi+t1+t2;都会由于pi的类型为float型,精度为1e-6而产生赋值损失。而对于pi=pi+t2的情况,其损失的总是1/n的第6位小数,故而只有在n>1e6时才会在这个等式中产生误差。对于
pi=pi+t1+t2,其展开是pi=pi+2/((n+2)*(n+4)),故而在n>1e3时,其后面一项几乎就被忽略了,故而精度最大只能是1e-3。
2013-04-16 10:14
dengjianqing
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2013-4-15
收藏
得分:0 
或者可以把pi=pi+t1+t2;拆成两项,即pi=pi+t1;pi=pi+t2;这样也应该是可以提高精度的。
2013-04-16 10:22
快速回复:关于求圆周率PI的近似值的问题(两种算法精度相差很大,想知道是由哪一 ...
数据加载中...
 
   



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

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