]>
Commit | Line | Data |
---|---|---|
f7eac6eb RM |
1 | |
2 | ||
3 | /* @(#)w_pow.c 5.2 93/10/01 */ | |
4 | /* | |
5 | * ==================================================== | |
6 | * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. | |
7 | * | |
8 | * Developed at SunPro, a Sun Microsystems, Inc. business. | |
9 | * Permission to use, copy, modify, and distribute this | |
cccda09f | 10 | * software is freely granted, provided that this notice |
f7eac6eb RM |
11 | * is preserved. |
12 | * ==================================================== | |
13 | */ | |
14 | ||
cccda09f | 15 | /* |
f7eac6eb RM |
16 | * wrapper pow(x,y) return x**y |
17 | */ | |
18 | ||
a334319f | 19 | #include "math.h" |
f7eac6eb RM |
20 | #include "math_private.h" |
21 | ||
22 | ||
23 | #ifdef __STDC__ | |
24 | double __pow(double x, double y) /* wrapper pow */ | |
25 | #else | |
26 | double __pow(x,y) /* wrapper pow */ | |
27 | double x,y; | |
28 | #endif | |
29 | { | |
30 | #ifdef _IEEE_LIBM | |
31 | return __ieee754_pow(x,y); | |
32 | #else | |
33 | double z; | |
34 | z=__ieee754_pow(x,y); | |
35 | if(_LIB_VERSION == _IEEE_|| __isnan(y)) return z; | |
36 | if(__isnan(x)) { | |
cccda09f | 37 | if(y==0.0) |
f7eac6eb | 38 | return __kernel_standard(x,y,42); /* pow(NaN,0.0) */ |
cccda09f | 39 | else |
f7eac6eb RM |
40 | return z; |
41 | } | |
7ef90c15 | 42 | if(x==0.0) { |
f7eac6eb RM |
43 | if(y==0.0) |
44 | return __kernel_standard(x,y,20); /* pow(0.0,0.0) */ | |
7ef90c15 | 45 | if(__finite(y)&&y<0.0) { |
0d8733c4 UD |
46 | if (signbit (x) && signbit (z)) |
47 | return __kernel_standard(x,y,23); /* pow(-0.0,negative) */ | |
48 | else | |
49 | return __kernel_standard(x,y,43); /* pow(+0.0,negative) */ | |
7ef90c15 | 50 | } |
f7eac6eb RM |
51 | return z; |
52 | } | |
53 | if(!__finite(z)) { | |
54 | if(__finite(x)&&__finite(y)) { | |
55 | if(__isnan(z)) | |
56 | return __kernel_standard(x,y,24); /* pow neg**non-int */ | |
cccda09f | 57 | else |
f7eac6eb RM |
58 | return __kernel_standard(x,y,21); /* pow overflow */ |
59 | } | |
cccda09f | 60 | } |
f7eac6eb RM |
61 | if(z==0.0&&__finite(x)&&__finite(y)) |
62 | return __kernel_standard(x,y,22); /* pow underflow */ | |
63 | return z; | |
64 | #endif | |
65 | } | |
66 | weak_alias (__pow, pow) | |
cccda09f UD |
67 | #ifdef NO_LONG_DOUBLE |
68 | strong_alias (__pow, __powl) | |
69 | weak_alias (__pow, powl) | |
70 | #endif |