找到第N个数字的Pi

时间:2013-07-09 22:18:50

标签: c++ pi arbitrary-precision

我开始自学C ++直到我的课程在秋季开课。我想知道你是否能够帮我提出一个更好的方法来询问用户他们想要的数字pi数字,然后显示它。我的问题是使用pi = atan(1)* 4并不精确到大约10位小数。是否有更好的内置数字,pi至少至少20个小数位?到目前为止,这就是我所拥有的,谢谢!

#include <iostream>
#include <string>
#include <iomanip>
#include <ios>
#include <sstream>
using namespace std;
using std::setprecision;
using std::streamsize;


int main()
{
    double pi = atan(1)*4;
    int input = 0;
    while(true)
    {
        cout << "Please enter how many digits of PI you would like to see (Max 20): ";
        cin >> input;
        if(input > 0 && input <= 20)
        {
            break;
        }
        else
        {
            cout << "That's not a valid number! Try again." << endl;
        }
    }
    streamsize prec = cout.precision();
    cout << setprecision(input);
    cout << "Here you go: " << pi <<endl;
    system("pause");
}

3 个答案:

答案 0 :(得分:14)

执行此操作的最简单方法可能只是包含您想要的数字std::string"3.14159265358979323846264338327950288419"),然后只打印小数点以外的第一个input位数。

答案 1 :(得分:4)

我会说这不是一个C ++问题,更多的是数学问题。有几个无限系列很快就会收敛到Pi的真值。你看过the Wikipedia article on this topic吗?

至于精确到九位或十位数,您可能会遇到使用double的舍入问题(尤其是使用某些计算方法)。我会考虑研究一个任意精度的数学库。我是MPFR的忠实粉丝,但我确定Boost有类似的东西,如果你更喜欢它(请记住Boost是一个C ++库,而MPFR是一个C库[虽然你当然可以使用C ++中的C代码]。)。

MPFR确实有一个C ++包装器,但总的来说,我不喜欢和C功能一样使用它,因为我上一次看它(不可否认,不久前),它并没有。完全是功能齐全。

可能还值得注意的是,由于您的目标是学习C ++,而不是学习如何有效地近似Pi,因此可能更喜欢通过例如解决这个问题来解决这个问题。正如Chris所说,只是从硬编码的字符串中检索前n位数。

答案 2 :(得分:0)

double将具有53位精度。每个位给出大约1/3的十进制数字(准确地说是log(10)/ log(2)),这意味着我们得到大约53/3的数字。这应该给17位数(包括开头的3位)。 atan(1)也没有给出pi / 4的所有数字(因为atan以及任何其他三角函数都是近似值),这似乎是合理的。

如果你想要比12-14位更多的数字,你需要使用“大数字”库,并且有许多“聪明”的方法来计算PI的小数。