前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C++ π 的计算

C++ π 的计算

作者头像
用户6021899
发布2020-03-23 16:30:05
3.4K0
发布2020-03-23 16:30:05
举报
文章被收录于专栏:Python编程 pyqt matplotlib

今天是3.14,我们用C++ 以各种方法试着来计算一下π的值。

割圆术:

迭代公式为:

代码语言:javascript
复制
long double circle_cutting(int n)
{
    long double a = 1.0;
    for(int i=0; i< n ; i++)
    {
        a = sqrt(2.0L-sqrt(4.0L-a*a));
    }
    return 3*pow(2,n)*a;
}

沃利斯乘积公式:

代码语言:javascript
复制
long double Wallis(long int n)
{
    //收敛的非常慢!
    long double s =1.0L;
    long double a;
    for (int i = 1 ;i <= n; i++)
    {
        a = 4.0L*i*i/(2*i-1.0)/(2*i+1.0);
        s *= a;
        //cout<<s<<endl;
    }
    return 2*s;
}

格雷果里-莱布尼茨公式:

x =1 时,结果即为 π/4。

代码语言:javascript
复制
long double Leibniz(long int n)
{
    //格雷果里-莱布尼茨公式法
    //收敛的非常慢!
    long double s =1.0L;
    long double a;
    for (int i = 1 ;i <= n; i++)
    {
        a = 1.0L/(2*i+1.0);
        if(i%2)
            a = 0-a;
        s += a;
    }
    return 4*s;
}

积分法:

代码语言:javascript
复制
long double integral(long int n)
{
    //1/4圆 积分。圆心在(0,0),半径为1
    long double s = 0.0;
    long double a,x;
    for (int i = 1 ;i <= n; i++)
    {
        x = 1.0L * i / n;
        a = 1.0L / n * sqrt(1 - x*x);
        s += a;
        //cout<<s<<endl;
    }
    return 4*s;
}

概率法:

x 在0~1, 且y在0~1的矩形内随机丢点,点落在中心为(0.5,0.5),半径为0.5的圆内的概率是pi/4。

代码语言:javascript
复制
long double random_drop(long int n)
{
    long double x, y, a ,b;
    long int s = 0;
    for (int i=0; i < n; i++)
    {
        x = rand()/(double)RAND_MAX;
        y = rand()/(double)RAND_MAX;
        a = x-0.5;
        b = y-0.5;
        if (a*a + b*b <= 0.25)
            s += 1;
    }
    return 4.0L * s / n;
}

main函数部分:

代码语言:javascript
复制
#include <iostream>
#include <cmath>
#include<iomanip>

using namespace std;
long double circle_cutting(int);
long double Wallis(long int);
long double Leibniz(long int);
long double integral(long int);
long double random_drop(long int);

int main()
{
    cout <<setprecision(12)<<circle_cutting(17)<<endl;//第17次迭代到相对最优
    cout << setprecision(12) << Wallis(100000000)<<endl;
    cout << setprecision(12) << Leibniz(100000000)<<endl;
    cout << setprecision(12) << integral(100000000)<<endl;
    cout << setprecision(12) << random_drop(10000000)<<endl;
    return 0;
}

从结果可以看出,割圆术收敛得较快,随机法精度最差。

其实使用BBP公式可以计算 π 小数点后任意一位。

这里不再展开。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-03-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Python可视化编程机器学习OpenCV 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档