This works as an unoptimized general case for most user defined types:
Code:
#include <iostream>
#include <cstdio>
#include <cstdlib>
namespace xtd {
template < typename Type, typename Integer >
Type&
raise( Type& lhs, Integer rhs )
{
static Type
one = Type( ),
once = one++;
Type const
value = lhs;
lhs = one;
while( rhs-- > zero )
lhs *= value;
return lhs;
}
template < typename Type, typename Integer >
inline Type&
operator ^=( Type& lhs, Integer rhs )
{
return raise( lhs, rhs );
}
template < typename Type, typename Integer >
Type
raised( Type const& lhs, Integer const& rhs )
{
Type
tmp( lhs );
return raise( tmp, rhs );
}
template < typename Type, typename Integer >
inline Type
operator ^( Type const& lhs, Integer const& rhs )
{
return raised( lhs, rhs );
}
} // namespace
using namespace std;
using namespace xtd;
int
main( int argc, char** argv )
{
if( argc == 3 )
{
cout << raised( strtod( argv[ 1 ], 0 ), atoi( argv[ 2 ] ) ) << endl;
return 0;
}
cout << "raise a number to some power - usage: '" << argv[ 0 ] << " float-value integer-exponent'" << endl;
return 1;
}
[edit]
Hmm...but what about negative exponents?
[/edit]
[edit]
Is this it?
Code:
template < typename Type, typename Integer >
Type&
raise( Type& lhs, Integer rhs )
{
static Type
one = Type( ),
once = one++;
Type
value;
if( rhs < Integer( ) )
{
rhs = -rhs;
value = lhs ? one / lhs : lhs;
}
else
value = lhs;
lhs = one;
while( rhs-- > Type( ) )
lhs *= value;
return lhs;
}
[/edit]