Boost Multiprecision ライブラリのドキュメントで明らかにされているように、 a から aboost::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>!
acpp_int
から固定幅浮動小数点型 (つまり、 a ) に変換できるということは、 aからライブラリ内の任意幅cpp_dec_float_50
の浮動小数点型 (つまり、 a ) に変換できる可能性があるという 1 つの希望を与えてくれます。ただし、これは機能しません。次の簡単なサンプル プログラムが示すように、Visual Studio 2013 では変換が失敗します。cpp_int
cpp_dec_float<0>
#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 コードからの次のコード スニペットに表示されます<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;
}
エラーメッセージは次のとおりです。
エラー 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 boost::multiprecision::detail::expression &' のテンプレート引数を 'const next_type' から推測できませんでした
boost::multiprecision::cpp_int
aを aに変換することは可能でしょうかboost::multiprecision::cpp_dec_float<0>
(のように固定小数点精度の浮動小数点型に変換するのではなくcpp_dec_float_50
)?
(私のプログラムでは、浮動小数点数のインスタンスが常に 1 つだけインスタンス化され、頻繁に更新されないことに注意してください。そのため、この 1 つのインスタンスが大量のメモリを消費し、実際にサポートするのに長い時間がかかることは問題ありません。膨大な数。)
ありがとう!