summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorvlefevre <vlefevre@280ebfd0-de03-0410-8827-d642c229c3f4>2018-09-04 14:06:25 +0000
committervlefevre <vlefevre@280ebfd0-de03-0410-8827-d642c229c3f4>2018-09-04 14:06:25 +0000
commit5ff7148cd97ef2146c5d47692c941ad81ebcbcbf (patch)
tree50b0d3d8841fda7adfccfafdcbc2ab74f6be216c
parent46e2f2d283025ba0f6b69e426d2ceb7f30550639 (diff)
downloadmpfr-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.c20
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);