Boost.Multiprecision 浮動小数点数型から整数型への変換

Boost.Multiprecisionには、cpp_dec_floatからcpp_intへ変換する機構がないようなので、それらしい動作をするものを書きました。
ここでは、cpp_dec_floatの変数をfloor()関数で小数点以下を切り捨て、文字列に変換し、文字列を受け取るcpp_intのコンストラクタで変換を行っています。

#include <iostream>
#include <boost/multiprecision/cpp_dec_float.hpp>
#include <boost/multiprecision/cpp_int.hpp>
 
int main()
{
    namespace mp = boost::multiprecision;
 
    mp::cpp_dec_float_50 f = 3.14;
    mp::cpp_int n { mp::cpp_dec_float_50(mp::floor(f)).str() };
 
    std::cout << n << std::endl;
}
3

一度cpp_dec_floatに変換しなおしているのは、floor()の結果がcpp_dec_floatではなく式テンプレートになっているからです。


文字列への変換はそれなりにコストが大きいので、この方法を推奨するようなことはとくにしません。
丸め演算はほかに、ceil(切り上げ)、round(最近接偶数への丸め)があります。