diff options
author | vlefevre <vlefevre@280ebfd0-de03-0410-8827-d642c229c3f4> | 2010-08-23 13:34:08 +0000 |
---|---|---|
committer | vlefevre <vlefevre@280ebfd0-de03-0410-8827-d642c229c3f4> | 2010-08-23 13:34:08 +0000 |
commit | 914111184a397b4d178a1d2b3b543cadf7735bcf (patch) | |
tree | 1992bd286d81f9adde4abb6f96f02352a8c41e98 /src/gmp_op.c | |
parent | e008967ccf0a09bb1f35d58142f675bde4daebcd (diff) | |
download | mpfr-914111184a397b4d178a1d2b3b543cadf7735bcf.tar.gz |
[src/gmp_op.c] Extend the exponent range in mpfr_add_q / mpfr_sub_q
(overflow/underflow exceptions are not supported yet).
[tests/tgmpop.c] Added corresponding testcases.
git-svn-id: svn://scm.gforge.inria.fr/svn/mpfr/trunk@7102 280ebfd0-de03-0410-8827-d642c229c3f4
Diffstat (limited to 'src/gmp_op.c')
-rw-r--r-- | src/gmp_op.c | 14 |
1 files changed, 12 insertions, 2 deletions
diff --git a/src/gmp_op.c b/src/gmp_op.c index d99378749..76741e2d7 100644 --- a/src/gmp_op.c +++ b/src/gmp_op.c @@ -224,6 +224,7 @@ mpfr_add_q (mpfr_ptr y, mpfr_srcptr x, mpq_srcptr z, mpfr_rnd_t rnd_mode) mpfr_prec_t p; mpfr_exp_t err; int res; + MPFR_SAVE_EXPO_DECL (expo); MPFR_ZIV_DECL (loop); if (MPFR_UNLIKELY (MPFR_IS_SINGULAR (x))) @@ -256,6 +257,8 @@ mpfr_add_q (mpfr_ptr y, mpfr_srcptr x, mpq_srcptr z, mpfr_rnd_t rnd_mode) } } + MPFR_SAVE_EXPO_MARK (expo); + p = MPFR_PREC (y) + 10; mpfr_init2 (t, p); mpfr_init2 (q, p); @@ -293,7 +296,9 @@ mpfr_add_q (mpfr_ptr y, mpfr_srcptr x, mpq_srcptr z, mpfr_rnd_t rnd_mode) MPFR_ZIV_FREE (loop); mpfr_clear (t); mpfr_clear (q); - return res; + + MPFR_SAVE_EXPO_FREE (expo); + return mpfr_check_range (y, res, rnd_mode); } int @@ -303,6 +308,7 @@ mpfr_sub_q (mpfr_ptr y, mpfr_srcptr x, mpq_srcptr z,mpfr_rnd_t rnd_mode) mpfr_prec_t p; int res; mpfr_exp_t err; + MPFR_SAVE_EXPO_DECL (expo); MPFR_ZIV_DECL (loop); if (MPFR_UNLIKELY (MPFR_IS_SINGULAR (x))) @@ -340,6 +346,8 @@ mpfr_sub_q (mpfr_ptr y, mpfr_srcptr x, mpq_srcptr z,mpfr_rnd_t rnd_mode) } } + MPFR_SAVE_EXPO_MARK (expo); + p = MPFR_PREC (y) + 10; mpfr_init2 (t, p); mpfr_init2 (q, p); @@ -378,7 +386,9 @@ mpfr_sub_q (mpfr_ptr y, mpfr_srcptr x, mpq_srcptr z,mpfr_rnd_t rnd_mode) MPFR_ZIV_FREE (loop); mpfr_clear (t); mpfr_clear (q); - return res; + + MPFR_SAVE_EXPO_FREE (expo); + return mpfr_check_range (y, res, rnd_mode); } int |