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 );
}
|