正如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);