summaryrefslogtreecommitdiffstats
path: root/mdk-stage1/dietlibc/libm/ipow.c
blob: 399986ea1d9842f58c9a79b962a3900756d3db8b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#define _GNU_SOURCE
#include <math.h>
/*
 * This is not standard, but often you only need such this function
 * which is much shorter than the generic pow() function.
 *
 *   double  ipow ( double mant, int expo );
 */

double  ipow ( double mant, int expo )
{
    double        ret = 1.;
    unsigned int  e   = expo;	/* Some attention is necessary for expo = 2^31 */
   
    if ( (int)e < 0 ) {
        e    = -e;
        mant = 1./mant;
    }
   
    while (1) {
        if ( e & 1 )
            ret *= mant;
        if ( (e >>= 1) == 0 )
            break;
        mant *= mant;
    }
   
    return ret;
}