计算 Catalan 常数的意外值

Unexpected Value for the Calculation of Catalan's Constant

函数如下:

arbFloat catalan(){
    arbFloat output, n = 0, first, second;
    std::string preComp, postComp;
    do{
        preComp = resizeArbtoString(first);
        first += (1.0 / pow(2.0, 4.0 * n)) * (
                (- 1.0 / (2.0 * pow(8.0*n + 2.0, 2.0))) +
                (1.0 / (4.0 * pow(8.0*n + 3.0, 2.0))) +
                (- 1.0 / (8.0 * pow(8.0*n + 5.0, 2.0))) +
                (1.0 / (8.0 * pow(8.0*n + 6.0, 2.0))) +
                (-1.0 / (16.0 * pow(8.0*n + 7.0, 2.0))) +
                (1.0 / (2.0 * pow(8.0*n + 1.0, 2.0)))
                );
        postComp = resizeArbtoString(first);
        n++;
    } while(preComp != postComp);
    n = 0;
    do{
        preComp = resizeArbtoString(second);
        second += (1.0 / pow(2.0 , 12.0 * n)) * (
                (1.0 / (16.0 * pow(8.0*n + 2, 2.0))) +
                (1.0 / (64.0 * pow(8.0*n + 3, 2.0))) +
                (-1.0 / (512.0 * pow(8.0*n + 5, 2.0))) +
                (-1.0 / (1024.0 * pow(8.0*n + 6, 2.0))) +
                (1.0 / (4096.0 * pow(8.0*n + 7, 2.0))) +
                (1.0 / (8.0 * pow(8.0*n + 1, 2.0)))
                );
        postComp = resizeArbtoString(second);
        n++;
    } while(preComp != postComp);

    output = (3.0*first) - (2.0*second);

    return output;
}

此代码旨在计算 Catalan's constant. I am using the method that quickly converges 的值,与缓慢收敛的方程相比。

arbFloat是一个Boost多精度cpp_dec_float,精度为小数点后100位:

typedef boost::multiprecision::number<boost::multiprecision::cpp_dec_float<100>> arbFloat

函数resizeArbtoString()只是将变量转换为字符串,并调整它的大小以考虑第一个小数点和小数点。这里不重要,我已经验证了它不会影响结果。

我在计算前后得到 first 的值,以在绕过精度时停止无限循环(变量 second 相同)。 do-while 循环检查这一点。这就是使它成为一种迭代方法的原因。

两个do-while循环分别得到方程中两个求和的值(下图)。然后 output 变量将 第一个 总和乘以 3,第二个总和乘以 -2,然后将它们相加。

此函数返回值:

0.9159456632705320620288006061761625716626752650763000222738355046579667073981960968090933049341304381

当值应该改为:

.915965594177219015054603514932384110774149374281672134266498119621763019776254769479356512926115106248574

(正确constant value via OEIS

这是我在创建此函数时引用的等式:

为什么返回的值不精确?

你的 1.0 / 4096.0 第二个词应该是 -1.0 / 4096.0