diff options
author | zimmerma <zimmerma@280ebfd0-de03-0410-8827-d642c229c3f4> | 2004-02-16 17:12:45 +0000 |
---|---|---|
committer | zimmerma <zimmerma@280ebfd0-de03-0410-8827-d642c229c3f4> | 2004-02-16 17:12:45 +0000 |
commit | 5094d98158eff8a199b86a34bc1a00a8308fbfe9 (patch) | |
tree | aa0d778d07058b4827cc375c5f7dda96d62623b2 /div.c | |
parent | 8b524829df9b1eb43cd0ef29a378face7e97e17f (diff) | |
download | mpfr-5094d98158eff8a199b86a34bc1a00a8308fbfe9.tar.gz |
deal with overflow/underflow in mpfr_div
git-svn-id: svn://scm.gforge.inria.fr/svn/mpfr/trunk@2734 280ebfd0-de03-0410-8827-d642c229c3f4
Diffstat (limited to 'div.c')
-rw-r--r-- | div.c | 14 |
1 files changed, 13 insertions, 1 deletions
@@ -444,7 +444,19 @@ mpfr_div (mpfr_ptr q, mpfr_srcptr u, mpfr_srcptr v, mp_rnd_t rnd_mode) TMP_FREE (marker); MPFR_MANT(q)[0] &= ~((MPFR_LIMB_ONE << rw) - MPFR_LIMB_ONE); - MPFR_SET_EXP (q, qexp); + MPFR_EXP(q) = qexp; + + /* check for underflow/overflow */ + + if (MPFR_UNLIKELY(qexp > __gmpfr_emax)) + inex = mpfr_set_overflow (q, rnd_mode, sign_quotient); + else if (MPFR_UNLIKELY(qexp < __gmpfr_emin)) + { + if (rnd_mode == GMP_RNDN && ((qexp < __gmpfr_emin - 1) || + (inex == 0 && mpfr_powerof2_raw (q)))) + rnd_mode = GMP_RNDZ; + inex = mpfr_set_underflow (q, rnd_mode, sign_quotient); + } MPFR_RET(inex); } |