diff options
author | vlefevre <vlefevre@280ebfd0-de03-0410-8827-d642c229c3f4> | 2017-10-04 15:25:26 +0000 |
---|---|---|
committer | vlefevre <vlefevre@280ebfd0-de03-0410-8827-d642c229c3f4> | 2017-10-04 15:25:26 +0000 |
commit | 98c8aca9c0aa302cf2e2118ed0ef0656a43a0576 (patch) | |
tree | 4d12ace6ae6932ce017810bb3774ae922f6ae653 /src/get_si.c | |
parent | 1460a3ebe3af072cf076f9cf69c38603d8104e1e (diff) | |
download | mpfr-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.c | 9 |
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; } |