diff options
Diffstat (limited to 'sysdeps/ieee754')
-rw-r--r-- | sysdeps/ieee754/dbl-64/e_exp2.c | 10 | ||||
-rw-r--r-- | sysdeps/ieee754/flt-32/e_exp2f.c | 10 |
2 files changed, 18 insertions, 2 deletions
diff --git a/sysdeps/ieee754/dbl-64/e_exp2.c b/sysdeps/ieee754/dbl-64/e_exp2.c index 30f0a8f529..01df62150d 100644 --- a/sysdeps/ieee754/dbl-64/e_exp2.c +++ b/sysdeps/ieee754/dbl-64/e_exp2.c @@ -120,7 +120,15 @@ __ieee754_exp2 (double x) if (!unsafe) return result; else - return result * scale_u.d; + { + result *= scale_u.d; + if (result < DBL_MIN) + { + double force_underflow = result * result; + math_force_eval (force_underflow); + } + return result; + } } else /* Return x, if x is a NaN or Inf; or overflow, otherwise. */ diff --git a/sysdeps/ieee754/flt-32/e_exp2f.c b/sysdeps/ieee754/flt-32/e_exp2f.c index 0b75a7ea2a..bc62042966 100644 --- a/sysdeps/ieee754/flt-32/e_exp2f.c +++ b/sysdeps/ieee754/flt-32/e_exp2f.c @@ -109,7 +109,15 @@ __ieee754_exp2f (float x) if (!unsafe) return result; else - return result * scale_u.f; + { + result *= scale_u.f; + if (result < FLT_MIN) + { + float force_underflow = result * result; + math_force_eval (force_underflow); + } + return result; + } } /* Exceptional cases: */ else if (isless (x, himark)) |