计算 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
。
函数如下:
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
。