
#include <math.h>

double  pow ( double mant, double expo )
{
    unsigned int  e;
    long double   ret;

    /* special cases 0^x */
    if ( mant == 0. ) {
        if ( expo > 0. )
            return 0.;
        else if ( expo == 0. )
            return 1.;
        else
            return 1./mant;
    }
    
    /* special cases x^n with n is integer */
    if ( expo == (int) (e = (int) expo) ) {
           
        if ( (int)e < 0 ) {
            e    = -e;
            mant = 1./mant;
        }
   
        ret = 1.;
        
        while (1) {
            if ( e & 1 )
                ret *= mant;
            if ( (e >>= 1) == 0 )
                break;
            mant *= mant;
         }
        return ret;
    }
    
    /* normal case */
    return exp2 ( log2 (mant) * expo );
}
