summaryrefslogtreecommitdiff
path: root/src/gmp_op.c
diff options
context:
space:
mode:
authorvlefevre <vlefevre@280ebfd0-de03-0410-8827-d642c229c3f4>2010-08-23 13:34:08 +0000
committervlefevre <vlefevre@280ebfd0-de03-0410-8827-d642c229c3f4>2010-08-23 13:34:08 +0000
commit914111184a397b4d178a1d2b3b543cadf7735bcf (patch)
tree1992bd286d81f9adde4abb6f96f02352a8c41e98 /src/gmp_op.c
parente008967ccf0a09bb1f35d58142f675bde4daebcd (diff)
downloadmpfr-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.c14
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