diff options
author | vlefevre <vlefevre@280ebfd0-de03-0410-8827-d642c229c3f4> | 2018-09-04 14:06:25 +0000 |
---|---|---|
committer | vlefevre <vlefevre@280ebfd0-de03-0410-8827-d642c229c3f4> | 2018-09-04 14:06:25 +0000 |
commit | 5ff7148cd97ef2146c5d47692c941ad81ebcbcbf (patch) | |
tree | 50b0d3d8841fda7adfccfafdcbc2ab74f6be216c | |
parent | 46e2f2d283025ba0f6b69e426d2ceb7f30550639 (diff) | |
download | mpfr-5ff7148cd97ef2146c5d47692c941ad81ebcbcbf.tar.gz |
[src/sqrt_ui.c] Moved MPFR_SAVE_EXPO_FREE after mpfr_sqrt because
the uu argument may be out of range and there is no guarantee that
mpfr_sqrt can handle that. Improved consistency; code refactoring.
git-svn-id: svn://scm.gforge.inria.fr/svn/mpfr/trunk@13122 280ebfd0-de03-0410-8827-d642c229c3f4
-rw-r--r-- | src/sqrt_ui.c | 20 |
1 files changed, 7 insertions, 13 deletions
diff --git a/src/sqrt_ui.c b/src/sqrt_ui.c index a887720ea..c3a2dbf58 100644 --- a/src/sqrt_ui.c +++ b/src/sqrt_ui.c @@ -27,12 +27,12 @@ int mpfr_sqrt_ui (mpfr_ptr r, unsigned long u, mpfr_rnd_t rnd_mode) { if (u) -#ifdef MPFR_LONG_WITHIN_LIMB { mpfr_t uu; + int inex; +#ifdef MPFR_LONG_WITHIN_LIMB mp_limb_t up[1]; int cnt; - int inex; MPFR_SAVE_EXPO_DECL (expo); MPFR_TMP_INIT1 (up, uu, GMP_NUMB_BITS); @@ -42,26 +42,20 @@ mpfr_sqrt_ui (mpfr_ptr r, unsigned long u, mpfr_rnd_t rnd_mode) MPFR_SAVE_EXPO_MARK (expo); MPFR_SET_EXP (uu, GMP_NUMB_BITS - cnt); - inex = mpfr_sqrt(r, uu, rnd_mode); - MPFR_SAVE_EXPO_FREE (expo); - return mpfr_check_range(r, inex, rnd_mode); - } + inex = mpfr_sqrt (r, uu, rnd_mode); #else - { - mpfr_t uu; - int ret; MPFR_SAVE_EXPO_DECL (expo); mpfr_init2 (uu, sizeof (unsigned long) * CHAR_BIT); /* Warning: u might be outside the current exponent range! */ MPFR_SAVE_EXPO_MARK (expo); mpfr_set_ui (uu, u, MPFR_RNDZ); - MPFR_SAVE_EXPO_FREE (expo); - ret = mpfr_sqrt (r, uu, rnd_mode); + inex = mpfr_sqrt (r, uu, rnd_mode); mpfr_clear (uu); - return ret; - } #endif /* MPFR_LONG_WITHIN_LIMB */ + MPFR_SAVE_EXPO_FREE (expo); + return mpfr_check_range (r, inex, rnd_mode); + } else /* sqrt(0) = 0 */ { MPFR_SET_ZERO(r); |