2013年6月13日木曜日

boost::multiprecision 仮数部・指数部の取得

ドキュメントが足りてない感じで、理解するのに結構時間を要してしまったので備忘録。 長精度の整数型 cpp_int 、長精度の浮動小数点型 cpp_dec_float, 長精度の分数型 cpp_rational と大別して3タイプの型があり、精度指定ができるなど、それぞれのタイプも細かい設定ができるようになっています。そうすると、無数に型が作成可能な状態になり、爆発する型同士の組み合わせによる演算を、ひとつひとつ書いてたら大変な事になります。これを解決するために MPL を利用して型同士の種類で処理を分岐させています。 系統だって演算できるようにするための基本型が、number < BackendType, ExpressionTemplates > になり、BackendType が先の3タイプの型に相当します。 それぞれのタイプの型のメンバ関数にアクセスしたければ、number::backend() というメンバ関数をコールして、BackendType を取り出しアクセスする感じになります。 以下、サンプルです。
#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;
}

0 件のコメント: