Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/138.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ boost::multiprecision::gmp\u float::operator=?中存在神秘的堆栈溢出异常?_C++_Boost_Gmp_Mpfr_Boost Multiprecision - Fatal编程技术网

C++ boost::multiprecision::gmp\u float::operator=?中存在神秘的堆栈溢出异常?

C++ boost::multiprecision::gmp\u float::operator=?中存在神秘的堆栈溢出异常?,c++,boost,gmp,mpfr,boost-multiprecision,C++,Boost,Gmp,Mpfr,Boost Multiprecision,我正在尝试为我的一个大学项目计算pi,使用浮点后任意位数的公式。对于这项工作,我使用的是boost::multiprecision库,它只是我已经在机器上安装的mpfr和mpir的包装 到目前为止还不错,但我要么遗漏了什么,要么做错了什么,因为我的计算函数(计算公式中每次迭代的总和的函数)不时抛出StackOverflow异常。(当它启动时,它是一致的) 这就是它的样子 boost::多精度::mpf\u浮点计算器pi(int开始,int结束) { boost::multiprecision::

我正在尝试为我的一个大学项目计算pi,使用浮点后任意位数的公式。对于这项工作,我使用的是
boost::multiprecision
库,它只是我已经在机器上安装的mpfr和mpir的包装

到目前为止还不错,但我要么遗漏了什么,要么做错了什么,因为我的计算函数(计算公式中每次迭代的总和的函数)不时抛出
StackOverflow异常。(当它启动时,它是一致的)

这就是它的样子

boost::多精度::mpf\u浮点计算器pi(int开始,int结束)
{
boost::multiprecision::mpf\U浮点分区=0;
用于(;开始<结束;++开始)
{
boost::多精度::mpf\u浮点n=
阶乘(4*开始)*升压::多精度::mpf_浮点(1103+26390*开始);
boost::多精度::mpf\U浮点d=

boost::multiprecision::pow(factorial(start),4)*pow((boost::multiprecision::mpf_float)396,4*start);这是boost.multiprecision的最新版本中的一个bug-我现在正试图弄清楚这一点,但请看


请注意,使用mpfr而不是mpf将解决此问题。

我没有答案,但您可以通过重用某些术语来极大地提高性能。
[(n+1)!]^4=(n+1)^4*(n!)^4
396^[4(n+1)]=394^4*396^(4n)
150!^4
有1000多个数字,
394^(4n)
1500以上。可能这会隐藏问题。我目前正在制定最愚蠢的解决方案,然后继续优化,不过,感谢您的建议,我会在达到这一点时牢记这一点。关于数字溢出,我以前没有这个问题,加上这是在第一次迭代时发生的当起始值为0时,循环的起始值。@kuskmen:您对阶乘的定义在哪里?可能与您的问题无关,但我建议您使用mpfr\u浮点而不是mpf\u浮点。它还有一个优点,即它已经提供pi,因此您可以与您的结果进行比较。@Marglisse将mpf\u浮点更改为mpfr\u浮点“修复”这个问题,现在我没有得到如此例外,但我想问题仍然悬而未决,为什么有这样的强积金浮动
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++
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++
ParallelPi.exe!boost::multiprecision::backends::gmp_float<0>::precision() Line 630  C++
boost::multiprecision::mpf_float factorial(int n)
{
    boost::multiprecision::mpf_float fact = 1;
    for (int i = 1; i <= n; ++i)
        fact *= i;

    return fact;
}