0

我开始自学 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");
}
4

3 回答 3

14

最简单的方法可能只是std::string包含您想要的数字 ( "3.14159265358979323846264338327950288419"),然后只打印input小数点后的第一个数字。

于 2013-07-09T22:23:59.567 回答
4

我想说这不是一个 C++ 问题,而是一个数学问题。有几个无限级数很快收敛到 Pi 的真实值。您是否查看过有关此主题的 Wikipedia 文章

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

MPFR 确实有一个 C++ 包装器,但总的来说,我不像 C 函数那样喜欢使用它,因为我上次查看它时(诚然,不久前),它的功能并不完整。

还可能值得注意的是,由于您的目标是学习 C++,而不是学习如何有效地逼近 Pi,因此最好通过仅从硬编码字符串中检索前 n 位来解决此问题,正如克里斯所说。

于 2013-07-09T22:23:24.890 回答
0

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

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

于 2013-07-09T22:25:35.810 回答