diff options
author | vlefevre <vlefevre@280ebfd0-de03-0410-8827-d642c229c3f4> | 2020-03-25 20:04:16 +0000 |
---|---|---|
committer | vlefevre <vlefevre@280ebfd0-de03-0410-8827-d642c229c3f4> | 2020-03-25 20:04:16 +0000 |
commit | da9f4c660a6e1161ec94f8e7bd799b3146fb9690 (patch) | |
tree | 8b69ad14c6b7071594f38b8d1b0752743c8f0aff /src/sub1.c | |
parent | b2a08cf47032aa5c15d0887c9c0d47219c4052f6 (diff) | |
download | mpfr-da9f4c660a6e1161ec94f8e7bd799b3146fb9690.tar.gz |
[src/sub1.c] Fixed underflow handling in case c small (can occur only
with UBF).
git-svn-id: svn://scm.gforge.inria.fr/svn/mpfr/trunk@13814 280ebfd0-de03-0410-8827-d642c229c3f4
Diffstat (limited to 'src/sub1.c')
-rw-r--r-- | src/sub1.c | 8 |
1 files changed, 7 insertions, 1 deletions
diff --git a/src/sub1.c b/src/sub1.c index 1e9fd72ae..69a2871e1 100644 --- a/src/sub1.c +++ b/src/sub1.c @@ -210,7 +210,13 @@ mpfr_sub1 (mpfr_ptr a, mpfr_srcptr b, mpfr_srcptr c, mpfr_rnd_t rnd_mode) if (MPFR_UNLIKELY (exp_a > __gmpfr_emax)) return mpfr_overflow (a, rnd_mode, MPFR_SIGN (a)); if (MPFR_UNLIKELY (exp_a < __gmpfr_emin)) - goto underflow; + { + if (rnd_mode == MPFR_RNDN && + (exp_a < __gmpfr_emin - 1 || + (inexact * MPFR_INT_SIGN (a) >= 0 && mpfr_powerof2_raw (a)))) + rnd_mode = MPFR_RNDZ; + return mpfr_underflow (a, rnd_mode, MPFR_SIGN(a)); + } MPFR_SET_EXP (a, exp_a); MPFR_RET (inexact); } |