summaryrefslogtreecommitdiff
path: root/src/get_ui.c
diff options
context:
space:
mode:
authorvlefevre <vlefevre@280ebfd0-de03-0410-8827-d642c229c3f4>2017-10-12 14:23:53 +0000
committervlefevre <vlefevre@280ebfd0-de03-0410-8827-d642c229c3f4>2017-10-12 14:23:53 +0000
commitc25dc97f895f808eeb2a45d363358c0f6760f339 (patch)
tree9ccad4d8fbd567a48e93708c3d3ee4289e9bc827 /src/get_ui.c
parentfb50e23f3273d4fff908e58ad1b1728040361d17 (diff)
downloadmpfr-c25dc97f895f808eeb2a45d363358c0f6760f339.tar.gz
[src] Fixed the behavior of the mpfr_get_* functions in a very reduced
exponent range. (merged changesets r11770,11774,11775,11777 and r11779 manually from the trunk) git-svn-id: svn://scm.gforge.inria.fr/svn/mpfr/branches/3.1@11783 280ebfd0-de03-0410-8827-d642c229c3f4
Diffstat (limited to 'src/get_ui.c')
-rw-r--r--src/get_ui.c9
1 files changed, 9 insertions, 0 deletions
diff --git a/src/get_ui.c b/src/get_ui.c
index 48a5f333f..3c084eaca 100644
--- a/src/get_ui.c
+++ b/src/get_ui.c
@@ -30,6 +30,7 @@ mpfr_get_ui (mpfr_srcptr f, mpfr_rnd_t rnd)
mpfr_t x;
mp_size_t n;
mpfr_exp_t exp;
+ MPFR_SAVE_EXPO_DECL (expo);
if (MPFR_UNLIKELY (!mpfr_fits_ulong_p (f, rnd)))
{
@@ -44,10 +45,16 @@ mpfr_get_ui (mpfr_srcptr f, mpfr_rnd_t rnd)
for (s = ULONG_MAX, 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_IS_ZERO(x))
s = 0;
@@ -61,5 +68,7 @@ mpfr_get_ui (mpfr_srcptr f, mpfr_rnd_t rnd)
mpfr_clear (x);
+ MPFR_SAVE_EXPO_FREE (expo);
+
return s;
}