|
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