Welcome to mirror list, hosted at ThFree Co, Russian Federation.

cygwin.com/git/newlib-cygwin.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/newlib
diff options
context:
space:
mode:
Diffstat (limited to 'newlib')
-rw-r--r--newlib/libm/common/sf_pow.c10
1 files changed, 10 insertions, 0 deletions
diff --git a/newlib/libm/common/sf_pow.c b/newlib/libm/common/sf_pow.c
index f7b22b612..2946c611b 100644
--- a/newlib/libm/common/sf_pow.c
+++ b/newlib/libm/common/sf_pow.c
@@ -220,7 +220,17 @@ powf (float x, float y)
{
/* |y*log(x)| >= 126. */
if (ylogx > 0x1.fffffffd1d571p+6 * POWF_SCALE)
+ /* |x^y| > 0x1.ffffffp127. */
return __math_oflowf (sign_bias);
+ if (WANT_ROUNDING && WANT_ERRNO
+ && ylogx > 0x1.fffffffa3aae2p+6 * POWF_SCALE)
+ /* |x^y| > 0x1.fffffep127, check if we round away from 0. */
+ if ((!sign_bias
+ && eval_as_float (1.0f + opt_barrier_float (0x1p-25f)) != 1.0f)
+ || (sign_bias
+ && eval_as_float (-1.0f - opt_barrier_float (0x1p-25f))
+ != -1.0f))
+ return __math_oflowf (sign_bias);
if (ylogx <= -150.0 * POWF_SCALE)
return __math_uflowf (sign_bias);
#if WANT_ERRNO_UFLOW