diff options
Diffstat (limited to 'libm/e_pow.c')
-rw-r--r-- | libm/e_pow.c | 37 |
1 files changed, 37 insertions, 0 deletions
diff --git a/libm/e_pow.c b/libm/e_pow.c index 08670cce3..137f600c3 100644 --- a/libm/e_pow.c +++ b/libm/e_pow.c @@ -292,3 +292,40 @@ double attribute_hidden __ieee754_pow(double x, double y) else SET_HIGH_WORD(z,j); return s*z; } + +/* + * wrapper pow(x,y) return x**y + */ +#ifndef _IEEE_LIBM +double pow(double x, double y) +{ + double z = __ieee754_pow(x, y); + if (_LIB_VERSION == _IEEE_|| isnan(y)) + return z; + if (isnan(x)) { + if (y == 0.0) + return __kernel_standard(x, y, 42); /* pow(NaN,0.0) */ + return z; + } + if (x == 0.0) { + if (y == 0.0) + return __kernel_standard(x, y, 20); /* pow(0.0,0.0) */ + if (isfinite(y) && y < 0.0) + return __kernel_standard(x,y,23); /* pow(0.0,negative) */ + return z; + } + if (!isfinite(z)) { + if (isfinite(x) && isfinite(y)) { + if (isnan(z)) + return __kernel_standard(x, y, 24); /* pow neg**non-int */ + return __kernel_standard(x, y, 21); /* pow overflow */ + } + } + if (z == 0.0 && isfinite(x) && isfinite(y)) + return __kernel_standard(x, y, 22); /* pow underflow */ + return z; +} +#else +strong_alias(__ieee754_pow, pow) +#endif +libm_hidden_def(pow) |