summaryrefslogtreecommitdiffstats
path: root/mdk-stage1/dietlibc/libm/pow.c
blob: e0e5a2983e5fc16651ca71e501373e1e029e387c (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
30
31
32
33
34
35
36
37
38
39
40
41
42

#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 exp2 ( log2 (mant) * expo );
}