我正在尝试使用Ramanujan 的公式计算我的一个大学项目的 pi,用于浮点后的任意位数。对于这项工作,我使用的boost::multiprecision
库只是我已经安装在我的机器上的 mpfr 和 mpir 的包装器。
到目前为止一切都很好,但是我要么遗漏了什么,要么做错了什么,因为我的计算函数(计算公式中总和的每次迭代的函数)不时抛出StackOverflow exception
。(当它开始时它是一致的)
这是它的样子
boost::multiprecision::mpf_float calculatePi(int start, int end)
{
boost::multiprecision::mpf_float partition = 0;
for (; start < end; ++start)
{
boost::multiprecision::mpf_float n =
factorial(4 * start) * boost::multiprecision::mpf_float(1103 + 26390 * start);
boost::multiprecision::mpf_float d =
boost::multiprecision::pow(factorial(start), 4) * pow((boost::multiprecision::mpf_float)396, 4 * start); <-- this is where stackoverflow exception is thrown
partition += (n / d);
}
return (2 * boost::multiprecision::sqrt((boost::multiprecision::mpf_float)2) / 9801) * partition;
}
我承认我对整个任意精度计算/转换和库太陌生了,所以我可能会遗漏一些东西。
我无法向您展示完整的调用堆栈,因为它太长了,但是之后
ParallelPi.exe!boost::multiprecision::number<boost::multiprecision::backends::gmp_float<0>,1>::**do_multiplies**<boost::multiprecision::detail::expression<boost::multiprecision::detail::function,boost::multiprecision::detail::number_kind_floating_pointpow_funct<boost::multiprecision::backends::gmp_float<0> >,boost::multiprecision::number<boost::multiprecision::backends::gmp_float<0>,1>,int,void>,boost::multiprecision::detail::function>(const boost::multiprecision::detail::expression<boost::multiprecision::detail::function,boost::multiprecision::detail::number_kind_floating_pointpow_funct<boost::multiprecision::backends::gmp_float<0> >,boost::multiprecision::number<boost::multiprecision::backends::gmp_float<0>,1>,int,void> & e, const boost::multiprecision::detail::function & __formal) Line 1754 C++
然后有3603个后续调用
ParallelPi.exe!boost::multiprecision::number<boost::multiprecision::backends::gmp_float<0>,1>::**operator=**<boost::multiprecision::detail::function,boost::multiprecision::detail::number_kind_floating_pointpow_funct<boost::multiprecision::backends::gmp_float<0> >,boost::multiprecision::number<boost::multiprecision::backends::gmp_float<0>,1>,int,void>(const boost::multiprecision::detail::expression<boost::multiprecision::detail::function,boost::multiprecision::detail::number_kind_floating_pointpow_funct<boost::multiprecision::backends::gmp_float<0> >,boost::multiprecision::number<boost::multiprecision::backends::gmp_float<0>,1>,int,void> & e) Line 216 C++
ParallelPi.exe!boost::multiprecision::number<boost::multiprecision::backends::gmp_float<0>,1>::number<boost::multiprecision::backends::gmp_float<0>,1><boost::multiprecision::detail::function,boost::multiprecision::detail::number_kind_floating_pointpow_funct<boost::multiprecision::backends::gmp_float<0> >,boost::multiprecision::number<boost::multiprecision::backends::gmp_float<0>,1>,int,void>(const boost::multiprecision::detail::expression<boost::multiprecision::detail::function,boost::multiprecision::detail::number_kind_floating_pointpow_funct<boost::multiprecision::backends::gmp_float<0> >,boost::multiprecision::number<boost::multiprecision::backends::gmp_float<0>,1>,int,void> & e, void * __formal) Line 324 C++
只是导致后来很少调用stackoverflow异常
ParallelPi.exe!boost::multiprecision::backends::gmp_float<0>::precision() Line 630 C++
听起来很有趣,但我不记得calculatePi
在“工作”之前更改功能。
你们能帮我破译发生了什么,因为我似乎迷路了吗?
我的默认精度boost::multiprecision::mpf_float
是浮点数之后的 150 位数字,这以前不是问题(我记得我计算了一些具有 10 000 浮点精度的数字,而不是 SO 或其他)
要求
1.我的阶乘代码
boost::multiprecision::mpf_float factorial(int n)
{
boost::multiprecision::mpf_float fact = 1;
for (int i = 1; i <= n; ++i)
fact *= i;
return fact;
}