首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >boost::multiprecision::gmp_float::operator=中的神秘堆栈溢出异常?

boost::multiprecision::gmp_float::operator=中的神秘堆栈溢出异常?
EN

Stack Overflow用户
提问于 2019-05-21 20:25:50
回答 1查看 161关注 0票数 2

我试图计算我的大学项目之一的pi,使用拉马努扬氏公式计算浮点数后的任意数字数。对于这项工作,我使用的是boost::multiprecision库,它只是我已经安装在机器上的mpfr和mpir的包装器。

到目前为止还不错,但我不是遗漏了什么,就是做错了什么,因为我的计算函数(计算公式中和的每一次迭代的函数)不时地抛出StackOverflow exception。(当它开始时它是一致的)

这就是它的样子

代码语言:javascript
复制
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;
}

我承认,我对任意精确的计算/转换和库太陌生了,所以我可能遗漏了一些东西。

我不能给你看完整的呼叫堆栈,因为它太长了,但是之后

代码语言:javascript
复制
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相应的调用

代码语言:javascript
复制
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++

只会导致堆栈溢出异常,以后很少调用。

代码语言:javascript
复制
ParallelPi.exe!boost::multiprecision::backends::gmp_float<0>::precision() Line 630  C++

虽然听起来很有趣,但我不记得在calculatePi函数“起作用”之前改变了它。

你们能帮我破译一下我好像迷路了吗?

对于boost::multiprecision::mpf_float,我的默认精度是浮点之后的150位,这以前没有问题(我记得我用10,000个浮点精度计算了一些数字,不需要)

请求

1.我的阶乘代码

代码语言:javascript
复制
boost::multiprecision::mpf_float factorial(int n)
{
    boost::multiprecision::mpf_float fact = 1;
    for (int i = 1; i <= n; ++i)
        fact *= i;

    return fact;
}
EN

回答 1

Stack Overflow用户

发布于 2019-11-07 19:09:31

这是Boost.Multiprecision最近版本中的一个bug --我现在正试图解决这个问题,但请参阅https://github.com/boostorg/multiprecision/issues/164

请注意,使用mpfr而不是使用强积金将解决这个问题。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56245875

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档