这是功能:
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)
以下是我在创建此函数时引用的等式:
为什么这会返回一个不精确的值?
答案 0 :(得分:2)
您的1.0 / 4096.0
字词应为-1.0 / 4096.0
。