计算加泰罗尼亚常数的意外值

时间:2016-10-30 04:37:58

标签: c++ boost equation floating-accuracy

这是功能:

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的值。与缓慢收敛的等式相比,我使用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更正OEIS

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

Equation for quicker convergence towards Catalans Constant

为什么这会返回一个不精确的值?

1 个答案:

答案 0 :(得分:2)

您的1.0 / 4096.0字词应为-1.0 / 4096.0