如何从boost::multiprecision::cpp_int转换为cpp_dec_foat<0>(而不



正如Boost Multiprecision库文档中所述,从boost::multiprecision::cpp_int转换为boost::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>!

cpp_int转换为固定宽度浮点类型(即cpp_dec_float_50)的能力使人们有希望在库中从cpp_int转换为任意宽度浮点类型,即cpp_dec_float<0>。然而,这并不奏效;我在VisualStudio2013中的转换失败了,下面的简单示例程序演示了这一点:

#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
}

正如预期的那样,它确实成功地转换为cpp_dec_float_50,但如前所述,我希望转换为任意精度的浮点类型:cpp_dec_float<0>

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

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;
}

错误消息为:

错误C2784:'enable_if::result_type,detail::expression::resulttype>,bool>::typeboost::multiprecision::operator>(const增强::多精度::细节::表达式&,constboost::multiprecision::detail::expression&)':无法推导"const"的模板参数boost::multiprecision::detail::expression&'来自"const next_type"

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

(请注意,在我的程序中,任何时候只有一个浮点数实例被实例化,而且它很少更新,所以我可以让这个实例占用大量内存,并花费很长时间来支持真正巨大的数字。)

谢谢!

我对Boost Multiprecision没有太多经验,但在我看来,模板类cpp_dec_float<>就是他们所说的后端,您需要将其封装在number<>适配器中才能将其用作算术类型。

以下是我的看法:在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 << "nn"; // 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>();
}

输出:

1405006117752879898543142606244511569936384000000000
1.40501e+51

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

Dec decfloat(n);

相关内容

  • 没有找到相关文章

最新更新