注册 登录
编程论坛 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
yuccn2011-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
yuccn2011-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