File:  [DVB] / dietlibc / libm / pow.c
Revision 1.4: download - view: text, annotated - select for diffs
Fri Oct 10 13:37:34 2003 UTC (20 years, 8 months ago) by leitner
Branches: MAIN
CVS tags: HEAD
several metric tons of new ports (ppc64, s390x), new functionality (%m
in printf) and fixes from SuSE


#include <math.h>
#include "dietlibm.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 exp ( log (mant) * expo );
}

LinuxTV legacy CVS <linuxtv.org/cvs>