【发布时间】:2014-04-12 17:25:11
【问题描述】:
正如Boost Multiprecision library 文档中所述,从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 转换为任意类型-width 库中的浮点类型 - 即 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
}
确实按预期成功转换为cpp_dec_float_50,但如前所述,我希望转换为任意精度的浮点类型:cpp_dec_float<0>。
错误出现在文件<boost/multiprecision/detail/default_ops.hpp>中内部Boost Multiprecision代码的以下代码sn-p中:
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::result_type>,bool>::type boost::multiprecision::operator >(const boost::multiprecision::detail::expression &,常量 boost::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)?
(请注意,在我的程序中,任何时候都只实例化一个浮点数实例,并且不经常更新,所以我可以让这个实例占用大量内存并花费很长时间支持非常庞大的数字。)
谢谢!
【问题讨论】:
标签: c++ c++11 boost multiprecision