#include <iostream> #include <boost/multiprecision/cpp_int.hpp> #include <boost/multiprecision/cpp_dec_float.hpp> using namespace boost::multiprecision; int main() { number<cpp_int_backend<256, 256, signed_magnitude, unchecked, void> > bi = 323456789012; number<cpp_dec_float<50> > bf( "123456789012.3456" ); std::cout << bi << std::endl; std::cout << bf << std::endl; bf = static_cast< number<cpp_dec_float<50> > >( bi ); std::cout << bf << std::endl; double m; boost::int32_t e; bf.backend().extract_parts(m,e); std::cout << "mantissa = " << m << ", exponent = " << e << std::endl; std::cout << "isint ? " << bf.backend().isint() << std::endl; return 0; }
2013年6月13日木曜日
boost::multiprecision 仮数部・指数部の取得
ドキュメントが足りてない感じで、理解するのに結構時間を要してしまったので備忘録。
長精度の整数型 cpp_int 、長精度の浮動小数点型 cpp_dec_float, 長精度の分数型 cpp_rational と大別して3タイプの型があり、精度指定ができるなど、それぞれのタイプも細かい設定ができるようになっています。そうすると、無数に型が作成可能な状態になり、爆発する型同士の組み合わせによる演算を、ひとつひとつ書いてたら大変な事になります。これを解決するために MPL を利用して型同士の種類で処理を分岐させています。
系統だって演算できるようにするための基本型が、number < BackendType, ExpressionTemplates > になり、BackendType が先の3タイプの型に相当します。
それぞれのタイプの型のメンバ関数にアクセスしたければ、number::backend() というメンバ関数をコールして、BackendType を取り出しアクセスする感じになります。
以下、サンプルです。
登録:
コメントの投稿 (Atom)
0 件のコメント:
コメントを投稿