コンパイル時多倍長演算ライブラリ
誰か作っていないかな?
ちょびっとだけ作ってみる。
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; }