C++ 加泰罗尼亚语计算的意外值';s常数

C++ 加泰罗尼亚语计算的意外值';s常数,c++,boost,equation,floating-accuracy,C++,Boost,Equation,Floating Accuracy,下面是函数: arbFloat catalan(){ arbFloat输出,n=0,第一,第二; std::字符串预压缩、后压缩; 做{ preComp=重定尺寸的仲裁串(第一个); 第一+=(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)))+ (

下面是函数:

arbFloat catalan(){
arbFloat输出,n=0,第一,第二;
std::字符串预压缩、后压缩;
做{
preComp=重定尺寸的仲裁串(第一个);
第一+=(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=调整大小的仲裁字符串(第一个);
n++;
}while(预压缩!=后压缩);
n=0;
做{
preComp=调整大小的仲裁字符串(秒);
秒+=(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=调整大小的仲裁字符串(秒);
n++;
}while(预压缩!=后压缩);
输出=(3.0*第一)-(2.0*第二);
返回输出;
}
此代码用于计算的值。与缓慢收敛的方程相比,我使用的是

arbFloat
是一种精度为100位小数的Boost多精度:

typedef boost::multiprecision::number<boost::multiprecision::cpp_dec_float<100>> arbFloat
当值应改为:

.9159655941772190150546035149328341107741493742281672134266498119621763019776254764793565129261115106248574
(正确通过)

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


为什么返回的值不精确?

您的
1.0/4096.0
秒级术语应为
-1.0/4096.0

请勿使用。
pow
函数是一个浮点函数——有几篇文章指出,用户正在使用某些版本的g++,其中
pow
与整数指数一起使用时不会给出准确的结果。@Anonymous——请阅读我在主要部分中的评论。关于
pow
的使用,您可能还有其他问题。