如何将boost :: multiprecision :: cpp_int转换为cpp_dec_float <0>(而不是cpp_dec_float_50等)?

Dan*_*aum 4 c++ boost c++11 multiprecision

正如Boost Multiprecision库文档中所明确的那样,将a从a转换为a是很简单boost::multiprecision::cpp_intboost::multiprecision::cpp_dec_float:

// Some interconversions between number types are completely generic,
// and are always available, albeit the conversions are always explicit:

cpp_int cppi(2);
cpp_dec_float_50 df(cppi);    // OK, int to float // <-- But fails with cpp_dec_float<0>!
Run Code Online (Sandbox Code Playgroud)

从a转换cpp_int为固定宽度浮点类型(即a cpp_dec_float_50)的能力给出了一种希望,即可以在库中从a转换cpp_int任意宽度的浮点类型 - 即a cpp_dec_float<0>.但是,这不起作用; 我在Visual Studio 2013中转换失败,如下面的简单示例程序演示:

#include <boost/multiprecision/number.hpp>
#include <boost/multiprecision/cpp_int.hpp>
#include <boost/multiprecision/cpp_dec_float.hpp>

int main()
{
    boost::multiprecision::cpp_int n{ 0 };
    boost::multiprecision::cpp_dec_float<0> f{ n }; // Compile error in MSVC 2013
}
Run Code Online (Sandbox Code Playgroud)

确实成功转换成cpp_dec_float_50,符合市场预期,但如前所述,我希望能转换成任意精度的浮点类型:cpp_dec_float<0>.

该错误出现在文件中内部Boost Multiprecision代码的以下代码片段中<boost/multiprecision/detail/default_ops.hpp>:

template <class R, class T>
inline bool check_in_range(const T& t)
{
   // Can t fit in an R?
   if(std::numeric_limits<R>::is_specialized && std::numeric_limits<R>::is_bounded
      && (t > (std::numeric_limits<R>::max)()))
      return true;
   return false;
}
Run Code Online (Sandbox Code Playgroud)

错误消息是:

错误C2784:'enable_if :: result_type,detail :: expression :: result_type>,bool> :: type boost :: multiprecision :: operator>(const boost :: multiprecision :: detail :: expression&,const boost :: multiprecision :: detail :: expression&)':无法从'const next_type'推断'const boost :: multiprecision :: detail :: expression&'的模板参数

是否有可能将a转换boost::multiprecision::cpp_int为a boost::multiprecision::cpp_dec_float<0>(而不是转换为具有固定小数精度的浮点类型,如cpp_dec_float_50)?

(请注意,在我的程序中,只有一个浮点数的实例在任何时候被实例化,并且它不经常更新,所以我很好用这个实例占用大量内存并花费很长时间来真正支持数量庞大.)

谢谢!

seh*_*ehe 5

我没有与升压多倍太多的经验,但在我看来,该模板类cpp_dec_float<>就是他们所谓的后台,你需要将其包装在一个number<>转接器才能使用它作为一个算术类型.

以下是我对它的看法:Live On Coliru

#include <boost/multiprecision/number.hpp>
#include <boost/multiprecision/cpp_int.hpp>
#include <boost/multiprecision/cpp_dec_float.hpp>
#include <iostream>

namespace mp = boost::multiprecision;

int main()
{
    using Int = mp::cpp_int;

    // let's think of a nice large number
    Int n = 1;
    for (Int f = 42; f>0; --f)
        n *= f;

    std::cout << n << "\n\n"; // print it for vanity 

    // let's convert it to cpp_dec_float
    // and... do something with it
    using Dec = mp::number<mp::cpp_dec_float<0> >;
    std::cout << n.convert_to<Dec>();
}
Run Code Online (Sandbox Code Playgroud)

输出:

1405006117752879898543142606244511569936384000000000

1.40501e+51
Run Code Online (Sandbox Code Playgroud)

如果convert_to<>允许,那么显式转换构造函数也将起作用,我希望:

Dec decfloat(n);
Run Code Online (Sandbox Code Playgroud)