Boost logo

Boost Users :

From: ravioli_at_[hidden]
Date: 2002-06-11 17:11:02


Hi All,

Is there an interest into having a power() template calculating the N-th power of any number, when N is known at compile-time ?t uses the algorithm of the STL power function(), and runs between two or three times faster, and maybe could be of interest in the " <boost/math/common_factor.hpp> which provides run-time and compile-time evaluation of the greatest common divisor (GCD) or least common multiple (LCM)

It simply works this way, for example to have PI at exponent three :
double a = power_const<3>( 3.14159)

As the single include file is very short, please apologize if I give it straight on, just to save your time and to have an idea how badly you judge my poor code ;)

Thank for your understanding.

/******************************************************************************
** power_const.h
******************************************************************************/
template< class _Tp, int Exp, int Bool > struct power_const_t {
};

template< class _Tp, int Exp > struct power_const_t< _Tp, Exp, 0 > {
     inline static _Tp eval(const _Tp & the_t, const _Tp & the_P ) {
          return power_const_t<T, (Exp >> 1), ( (Exp >> 1) & 1) >::eval( the_t, the_P * the_P );
     }
};

template< class _Tp, int Exp > struct power_const_t< _Tp, Exp, 1 > {
     inline static _Tp eval(const _Tp & the_t, const _Tp & the_P ) {
          return the_P * power_const_t<T, (Exp >> 1), ( (Exp >> 1) & 1) >::eval( the_t, the_P * the_P );
     }
};

template< class _Tp > struct power_const_t< _Tp, 1, 0 > {
     inline static _Tp eval(const _Tp & the_t, const _Tp & the_P ) {
          return the_P ;
     }
};

template< class _Tp > struct power_const_t< _Tp, 1, 1 > {
     inline static _Tp eval(const _Tp & the_t, const _Tp & the_P ) {
          return the_P ;
     }
};

template< class _Tp > struct power_const_t< _Tp, 0, 0 > {
     inline static _Tp eval(const _Tp & the_t, const _Tp & the_P ) {
          return 1 ;
     }
};

template< class _Tp > struct power_const_t< _Tp, 0, 1 > {
     inline static _Tp eval(const _Tp & the_t, const _Tp & the_P ) {
          return the_P * the_P ;
     }
};

template< class _Tp, int N > inline _Tp power_const( const _Tp & the_t ) {
     return power_const_t<T, N, ( N & 1 ) >::eval( the_t, the_t );
};

template< class _Tp, int N > inline _Tp power_const( const _Tp & the_t ) {
     return power_const_t<T, N, ( N & 1 ) >::eval( the_t, the_t );
};

/******************************************************************************
** power_const.h
******************************************************************************/

[Non-text portions of this message have been removed]


Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net