コンパイル時多倍長演算ライブラリ

誰か作っていないかな?

ちょびっとだけ作ってみる。

const unsigned int BASE=100000;

template <typename T, T V>
struct value2type
{
  typedef T type;
  static const type value=V;
};
template<typename A, typename B, int LIM=-30>
struct ADD
{
  template <int J, bool = false>
    struct I
      {
        static const int value =( A::template I<J  >::value+B::template I<J  >::value
                                +(A::template I<J-1>::value+B::template I<J-1>::value)/BASE)%BASE;
      };
  template <bool b>
    struct I<LIM,b>:value2type<int,0>{};
};

template <typename A, typename B, int LIM=30>
struct DIV
{
  template <int J, bool = false>
    struct I
      {
        static const int tmp   = (A::template I<J>::value +I<J+1>::tmp*BASE)%B::value;
        static const int value = (A::template I<J>::value +I<J+1>::tmp*BASE)/B::value;
      };
  template <bool b>
    struct I<LIM,b>:value2type<int,0>
      {
        static const int tmp = 0;
      };
};

お試し
指数対数の底eを小数点以下100桁まで計算してみた。

struct X
{
  template <int J>
    struct I:value2type<int,J==0>{};
};

template <int I>
struct R: DIV<R<I-1>, value2type<int, I> > {};
template<> struct R<0>: X {};

template <int I>
struct E: ADD<E<I-1>, R<I> > {};
template<> struct E<0>: X {};


int main()
{
  std::cout      << E<70>::I< 0>::value << '.' << std::setfill('0')
  <<std::setw(5) << E<70>::I<-1>::value << ' '
  <<std::setw(5) << E<70>::I<-2>::value << ' '
  <<std::setw(5) << E<70>::I<-3>::value << ' '
  <<std::setw(5) << E<70>::I<-4>::value << ' '
  <<std::setw(5) << E<70>::I<-5>::value << ' '
  <<std::setw(5) << E<70>::I<-6>::value << ' '
  <<std::setw(5) << E<70>::I<-7>::value << ' '
  <<std::setw(5) << E<70>::I<-8>::value << ' '
  <<std::setw(5) << E<70>::I<-9>::value << ' '
  <<std::setw(5) << E<70>::I<-10>::value << ' '
  <<std::setw(5) << E<70>::I<-11>::value << ' '
  <<std::setw(5) << E<70>::I<-12>::value << ' '
  <<std::setw(5) << E<70>::I<-13>::value << ' '
  <<std::setw(5) << E<70>::I<-14>::value << ' '
  <<std::setw(5) << E<70>::I<-15>::value << ' '
  <<std::setw(5) << E<70>::I<-16>::value << ' '
  <<std::setw(5) << E<70>::I<-17>::value << ' '
  <<std::setw(5) << E<70>::I<-18>::value << ' '
  <<std::setw(5) << E<70>::I<-19>::value << ' '
  <<std::setw(5) << E<70>::I<-20>::value << std::endl;
  return 0;
}

おっと、GCC以外ではコンパイルできねぇな。まぁ、いっか。