注册 登录
编程论坛 VC++/MFC

各位高手能不能帮我看下为什么结果不是3.1415926???

韩雨航 发布于 2012-01-12 17:54, 1113 次点击
#include<iostream>
#include<cmath>
using namespace std;
void main()
{
    double sum=0,item=1;
    for(int denom=1,sign=1;abs(item)>1e-6;denom+=2,sign*=(-1))
    {
        item=sign/(double)denom;                        
        sum+=item;
    }
    cout<<"PI="<<sum*4<<endl;
}
11 回复
#2
BianChengNan2012-01-16 14:53
你最好把你用的方法的原理贴到这,好分析,我记不清了,虽然我学过这个法
#3
韩雨航2012-01-17 09:08
回复 2楼 BianChengNan
嗯嗯···
原理是级数逼近,π/4≈1-1/3+1/5-1/7+`````
先设定一个初项,然后一边累计,一边根据前一项求下一项~~
#4
BianChengNan2012-01-19 20:03
以下是引用韩雨航在2012-1-17 09:08:35的发言:

嗯嗯···
原理是级数逼近,π/4≈1-1/3+1/5-1/7+`````
先设定一个初项,然后一边累计,一边根据前一项求下一项~~
刚才自己运行了一下,并在网上查了一下。结论如下:
运算结果不够精确,也就是不是3.141592657....但也差不多。
cout输出的时候默认只输出了小数后面的5位,加上前面的整数部分3,一共是6位。
可以通过cout.precision(位数)调整要输出的位数,比如cout.precision(11),可以显示小数点后10位 还有整数部分的1位。


#5
韩雨航2012-01-20 20:36
不好意思,我的输出结果为什么是2.66667···
麻烦了~~
#6
BianChengNan2012-01-21 10:48
以下是引用韩雨航在2012-1-20 20:36:33的发言:

不好意思,我的输出结果为什么是2.66667···
麻烦了~~
不是吧???我运行过了啊,结果基本上是pi的值
#7
韩雨航2012-01-21 11:50
回复 6楼 BianChengNan
是vc++6.0????????
我是vc++6.0,我的软件出了问题??
#8
appleyuchi2012-01-22 19:26
#include<iomanip>
#include<iostream>
#include<cmath>
using namespace std;
void main()
{    double sum=0,item=1;
    for(int denom=1,sign=1;fabs(item)*10e8>1;denom+=2,sign*=(-1))
    {
        item=sign/(double)denom;   
sum+=item;


    }
cout<<"PI/4="<<setprecision(8)<<sum<<endl;
cout<<"PI="<<setprecision(8)<<sum*4.0<<endl;
}
这样就可以了,是QQ175273546的人说的
#9
BianChengNan2012-01-29 09:15
有意思,回去确认一下再
#10
BianChengNan2012-01-30 14:30
以下是引用韩雨航在2012-1-21 11:50:06的发言:

是vc++6.0????????
我是vc++6.0,我的软件出了问题??
抱歉,回去又确认了一下,确实是2.67777777,原因如下,当item为-0.33333的时候 abs(item) = 0, 0<1e-6,故循环不成立,提前退出了循环。
原因是abs是对整数进行取绝对值操作,首先把double型的值转换成整形,然后再取绝对值,用fabs函数应该就没问题了,因为fabs是对double型进行取绝对值的操作的函数。
我想这是原因所在了
#11
韩雨航2012-02-09 11:47
回复 8楼 appleyuchi
thank~~
#12
韩雨航2012-02-09 11:48
回复 10楼 BianChengNan
谢谢~~
1