summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorvlefevre <vlefevre@280ebfd0-de03-0410-8827-d642c229c3f4>2020-03-25 20:04:16 +0000
committervlefevre <vlefevre@280ebfd0-de03-0410-8827-d642c229c3f4>2020-03-25 20:04:16 +0000
commitda9f4c660a6e1161ec94f8e7bd799b3146fb9690 (patch)
tree8b69ad14c6b7071594f38b8d1b0752743c8f0aff
parentb2a08cf47032aa5c15d0887c9c0d47219c4052f6 (diff)
downloadmpfr-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
-rw-r--r--src/sub1.c8
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);
}