summaryrefslogtreecommitdiff
path: root/src/get_si.c
diff options
context:
space:
mode:
authorvlefevre <vlefevre@280ebfd0-de03-0410-8827-d642c229c3f4>2017-10-04 15:25:26 +0000
committervlefevre <vlefevre@280ebfd0-de03-0410-8827-d642c229c3f4>2017-10-04 15:25:26 +0000
commit98c8aca9c0aa302cf2e2118ed0ef0656a43a0576 (patch)
tree4d12ace6ae6932ce017810bb3774ae922f6ae653 /src/get_si.c
parent1460a3ebe3af072cf076f9cf69c38603d8104e1e (diff)
downloadmpfr-98c8aca9c0aa302cf2e2118ed0ef0656a43a0576.tar.gz
[src/{get_si.c,get_ui.c}] Fixed failure in mpfr_get_si and mpfr_get_ui
when called with a very reduced exponent range. git-svn-id: svn://scm.gforge.inria.fr/svn/mpfr/trunk@11770 280ebfd0-de03-0410-8827-d642c229c3f4
Diffstat (limited to 'src/get_si.c')
-rw-r--r--src/get_si.c9
1 files changed, 9 insertions, 0 deletions
diff --git a/src/get_si.c b/src/get_si.c
index d4ecabfe2..12279a573 100644
--- a/src/get_si.c
+++ b/src/get_si.c
@@ -28,6 +28,7 @@ mpfr_get_si (mpfr_srcptr f, mpfr_rnd_t rnd)
mpfr_prec_t prec;
long s;
mpfr_t x;
+ MPFR_SAVE_EXPO_DECL (expo);
if (MPFR_UNLIKELY (!mpfr_fits_slong_p (f, rnd)))
{
@@ -43,10 +44,16 @@ mpfr_get_si (mpfr_srcptr f, mpfr_rnd_t rnd)
for (s = LONG_MIN, prec = 0; s != 0; s /= 2, prec++)
{ }
+ MPFR_SAVE_EXPO_MARK (expo);
+
/* first round to prec bits */
mpfr_init2 (x, prec);
mpfr_rint (x, f, rnd);
+ /* The flags from mpfr_rint are the wanted ones. In particular,
+ it sets the inexact flag when necessary. */
+ MPFR_SAVE_EXPO_UPDATE_FLAGS (expo, __gmpfr_flags);
+
/* warning: if x=0, taking its exponent is illegal */
if (MPFR_UNLIKELY (MPFR_IS_ZERO(x)))
s = 0;
@@ -65,5 +72,7 @@ mpfr_get_si (mpfr_srcptr f, mpfr_rnd_t rnd)
mpfr_clear (x);
+ MPFR_SAVE_EXPO_FREE (expo);
+
return s;
}