gpt4 book ai didi

c++ - boost::multiprecision::gmp_float::operator =?中的神秘stackoverflow异常?

转载 作者:行者123 更新时间:2023-12-01 14:58:49 26 4
gpt4 key购买 nike

我正在尝试使用Ramanujan's公式为浮点后的任意位数计算我的大学项目之一的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位,这以前是没有问题的(我记得我用10000浮点数精度计算出了一些数字,而不是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;
}

最佳答案

这是Boost.Multiprecision的最新版本中的一个错误-我正在尝试解决这个问题,但请参见https://github.com/boostorg/multiprecision/issues/164

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

关于c++ - boost::multiprecision::gmp_float::operator =?中的神秘stackoverflow异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56245875/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com