编程论坛
注册
登录
编程论坛
→
C++教室
π/2=1+1/3+(1/3)*(2/5)+(1/3)*(2/5)*(3/7)+···
宇智波曌
发布于 2011-05-05 13:21, 892 次点击
π/2=1+1/3+(1/3)*(2/5)+(1/3)*(2/5)*(3/7)+···精度小于10^-5
用函数怎么写,有没有谁知道,急!!!
4 回复
#2
yuccn
2011-05-05 20:57
#include <iostream>
using namespace std;
double GetPI();
void main()
{
double dbPI = GetPI();
cout<<"PI = "<<dbPI<<endl;
}
double GetPI()
{
double dbPI = 0.0;
double dbTraver = 1.0;
double dbBuffer = 1.0;
do {
dbPI += dbBuffer;
dbBuffer *= dbTraver / (2 * dbTraver + 1);
dbTraver += 1.0;
} while (2 * dbBuffer > 0.000001); // 因为结束循环时候PI会放大2倍。所以误差值也要放大2倍来比较
dbPI *= 2;
return dbPI;
}
[
本帖最后由 yuccn 于 2011-5-5 21:03 编辑
]
#3
宇智波曌
2011-05-06 00:07
回复 2楼 yuccn
这个看不懂啊,能用#include <stdio.h> 写一个函数吗?
#4
yuccn
2011-05-06 08:32
程序代码:
#include
<stdio.h>
//
#include <iostream>
//
using namespace std;
double
GetPI();
void
main()
{
double
dbPI = GetPI();
printf(
"
PI = %lf \n
"
, dbPI);
//
cout<<"PI = "<<dbPI<<endl;
}
double
GetPI()
{
double
dbPI =
0.0
;
//
保存最后的PI结果
double
dbTraver =
1.0
;
//
用于遍历时候递增
double
dbBuffer =
1.0
;
//
保存误差值。也就是在循环过程中的 1/3、(1/3)*(2/5)、(1/3)*(2/5)*(3/7)
do
{
//
计算 1+1/3+(1/3)*(2/5)+(1/3)*(2/5)*(3/7)+···
//
要求误差值不大于0.00001 。也就是 第N次循环的结果减去N - 1 次循环的结果不大于0.00001
//
就是(1/3)*(2/5)*(3/7)…… 该值两倍小于0.00001时候就可以退出循环了 而循环中 dbBuffer保存了该值
dbPI += dbBuffer;
dbBuffer *= dbTraver / (
2
* dbTraver +
1
);
dbTraver +=
1.0
;
}
while
(
2
* dbBuffer >
0.000001
);
//
//
因为结束循环时候PI会放大2倍。所以误差值也要放大2倍来比较
dbPI *=
2
;
return
dbPI;
}
#5
宇智波曌
2011-05-06 11:57
回复 4楼 yuccn
谢啦。基本懂了
1