C++ 实施Bailey Borwein Plouffe

C++ 实施Bailey Borwein Plouffe,c++,math,pi,C++,Math,Pi,学校的一位老师决定给我一个挑战,让我找出圆周率的161位、271位和314位数字。在网上搜索了一段时间后,我终于想到贝利-博文-普劳夫算法应该是最适合这种情况的算法。我设法理解了这个表达,但我仍然不知道该如何实现它。我是否应该将k=0作为我需要的任何数字,然后添加结果?我认为这是我应该做的,但在尝试了一些实现之后,我总是得到一个4。。。有点不对劲。。。有人能解释一下如何实施这个吗 我的代码: #include <iostream> #include <math.h> u

学校的一位老师决定给我一个挑战,让我找出圆周率的161位、271位和314位数字。在网上搜索了一段时间后,我终于想到贝利-博文-普劳夫算法应该是最适合这种情况的算法。我设法理解了这个表达,但我仍然不知道该如何实现它。我是否应该将k=0作为我需要的任何数字,然后添加结果?我认为这是我应该做的,但在尝试了一些实现之后,我总是得到一个4。。。有点不对劲。。。有人能解释一下如何实施这个吗

我的代码:

#include <iostream>
#include <math.h>

using namespace std;

int main()
{
    int n;
    cin >> n;
    double pi = 0.0;

    for(int k = n; true; ++k)
    {
        pi += (4 / (8 * k + 1) - 2 / (8 * k + 4) - 1 / (8 * k + 5) - 1 / (8 * k + 6)) / pow(16, k);
        cout << pi << endl;
    }

    cout << pi << endl;

    return 0;
}
#包括
#包括
使用名称空间std;
int main()
{
int n;
cin>>n;
双pi=0.0;
for(int k=n;true;++k)
{
pi+=(4/(8*k+1)-2/(8*k+4)-1/(8*k+5)-1/(8*k+6))/pow(16,k);

cout有两个问题。首先,如果你需要将pi计算成许多位数,你必须想出一个保存位数的结构-一个
double
就不够了


第二,整数除法截断为下面的整数,这不是数学公式中的目的。

如果我没记错的话,BBP生成十六进制数字;我猜你在寻找十进制数字。我想Plouffe(谁真正发明了BBP公式;B&B跳上了他的潮流)还开发了一个类似的十进制数字公式。基于此,我认为您的解决方案中需要更多的代码。我的印象是,该公式可以从pi中获取任何数字,而无需记住以前的数字。那么,为什么您说我需要比双精度更大的东西来存储?IEEE双精度将容纳大约16位数字精度。在此之后,您只需添加太小而无法更改总和的贡献。@Frostbreaded问题是,浮点变量无法获得更高的精度。您需要使用数字执行操作,但如果要显示数字,则需要创建一个缓冲区、字符串、数组…以保持每个数字的精度分开,然后连接所有这些。