xref: /aosp_15_r20/external/fdlibm/w_pow.c (revision 1e651e1ef2b613db2c4b29ae59c1de74cf0222ae)
1*1e651e1eSRoland Levillain 
2*1e651e1eSRoland Levillain 
3*1e651e1eSRoland Levillain /* @(#)w_pow.c 1.3 95/01/18 */
4*1e651e1eSRoland Levillain /*
5*1e651e1eSRoland Levillain  * ====================================================
6*1e651e1eSRoland Levillain  * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
7*1e651e1eSRoland Levillain  *
8*1e651e1eSRoland Levillain  * Developed at SunSoft, a Sun Microsystems, Inc. business.
9*1e651e1eSRoland Levillain  * Permission to use, copy, modify, and distribute this
10*1e651e1eSRoland Levillain  * software is freely granted, provided that this notice
11*1e651e1eSRoland Levillain  * is preserved.
12*1e651e1eSRoland Levillain  * ====================================================
13*1e651e1eSRoland Levillain  */
14*1e651e1eSRoland Levillain 
15*1e651e1eSRoland Levillain /*
16*1e651e1eSRoland Levillain  * wrapper ieee_pow(x,y) return x**y
17*1e651e1eSRoland Levillain  */
18*1e651e1eSRoland Levillain 
19*1e651e1eSRoland Levillain #include "fdlibm.h"
20*1e651e1eSRoland Levillain 
21*1e651e1eSRoland Levillain 
22*1e651e1eSRoland Levillain #ifdef __STDC__
ieee_pow(double x,double y)23*1e651e1eSRoland Levillain 	double ieee_pow(double x, double y)	/* wrapper pow */
24*1e651e1eSRoland Levillain #else
25*1e651e1eSRoland Levillain 	double ieee_pow(x,y)			/* wrapper pow */
26*1e651e1eSRoland Levillain 	double x,y;
27*1e651e1eSRoland Levillain #endif
28*1e651e1eSRoland Levillain {
29*1e651e1eSRoland Levillain #ifdef _IEEE_LIBM
30*1e651e1eSRoland Levillain 	return  __ieee754_pow(x,y);
31*1e651e1eSRoland Levillain #else
32*1e651e1eSRoland Levillain 	double z;
33*1e651e1eSRoland Levillain 	z=__ieee754_pow(x,y);
34*1e651e1eSRoland Levillain 	if(_LIB_VERSION == _IEEE_|| ieee_isnan(y)) return z;
35*1e651e1eSRoland Levillain 	if(ieee_isnan(x)) {
36*1e651e1eSRoland Levillain 	    if(y==0.0)
37*1e651e1eSRoland Levillain 	        return __kernel_standard(x,y,42); /* ieee_pow(NaN,0.0) */
38*1e651e1eSRoland Levillain 	    else
39*1e651e1eSRoland Levillain 		return z;
40*1e651e1eSRoland Levillain 	}
41*1e651e1eSRoland Levillain 	if(x==0.0){
42*1e651e1eSRoland Levillain 	    if(y==0.0)
43*1e651e1eSRoland Levillain 	        return __kernel_standard(x,y,20); /* ieee_pow(0.0,0.0) */
44*1e651e1eSRoland Levillain 	    if(ieee_finite(y)&&y<0.0)
45*1e651e1eSRoland Levillain 	        return __kernel_standard(x,y,23); /* ieee_pow(0.0,negative) */
46*1e651e1eSRoland Levillain 	    return z;
47*1e651e1eSRoland Levillain 	}
48*1e651e1eSRoland Levillain 	if(!ieee_finite(z)) {
49*1e651e1eSRoland Levillain 	    if(ieee_finite(x)&&ieee_finite(y)) {
50*1e651e1eSRoland Levillain 	        if(ieee_isnan(z))
51*1e651e1eSRoland Levillain 	            return __kernel_standard(x,y,24); /* pow neg**non-int */
52*1e651e1eSRoland Levillain 	        else
53*1e651e1eSRoland Levillain 	            return __kernel_standard(x,y,21); /* pow overflow */
54*1e651e1eSRoland Levillain 	    }
55*1e651e1eSRoland Levillain 	}
56*1e651e1eSRoland Levillain 	if(z==0.0&&ieee_finite(x)&&ieee_finite(y))
57*1e651e1eSRoland Levillain 	    return __kernel_standard(x,y,22); /* pow underflow */
58*1e651e1eSRoland Levillain 	return z;
59*1e651e1eSRoland Levillain #endif
60*1e651e1eSRoland Levillain }
61