summaryrefslogtreecommitdiff
path: root/div_ui.c
diff options
context:
space:
mode:
authorvlefevre <vlefevre@280ebfd0-de03-0410-8827-d642c229c3f4>2003-05-26 15:20:27 +0000
committervlefevre <vlefevre@280ebfd0-de03-0410-8827-d642c229c3f4>2003-05-26 15:20:27 +0000
commitdf63968d02aa852cb35cd2f3f77f0ce6c8b521be (patch)
tree33e6ee6e6a9cbc64dc9d6866575aacef88315b6d /div_ui.c
parent44e08c925e0e6398cb36534341f25cada6f38393 (diff)
downloadmpfr-df63968d02aa852cb35cd2f3f77f0ce6c8b521be.tar.gz
Update related to MPFR_GET_EXP and MPFR_SET_EXP.
git-svn-id: svn://scm.gforge.inria.fr/svn/mpfr/trunk@2308 280ebfd0-de03-0410-8827-d642c229c3f4
Diffstat (limited to 'div_ui.c')
-rw-r--r--div_ui.c15
1 files changed, 8 insertions, 7 deletions
diff --git a/div_ui.c b/div_ui.c
index 66e174b6e..9e6380f30 100644
--- a/div_ui.c
+++ b/div_ui.c
@@ -32,6 +32,7 @@ mpfr_div_ui (mpfr_ptr y, mpfr_srcptr x, unsigned long int u, mp_rnd_t rnd_mode)
{
long int xn, yn, dif, sh, i;
mp_limb_t *xp, *yp, *tmp, c, d;
+ mp_exp_t exp;
int inexact, middle = 1;
TMP_DECL(marker);
@@ -80,7 +81,7 @@ mpfr_div_ui (mpfr_ptr y, mpfr_srcptr x, unsigned long int u, mp_rnd_t rnd_mode)
xp = MPFR_MANT(x);
yp = MPFR_MANT(y);
- MPFR_SET_EXP (y, MPFR_GET_EXP (x));
+ exp = MPFR_GET_EXP (x);
dif = yn + 1 - xn;
@@ -113,7 +114,7 @@ mpfr_div_ui (mpfr_ptr y, mpfr_srcptr x, unsigned long int u, mp_rnd_t rnd_mode)
{
tmp--;
sh = 0;
- MPFR_SET_EXP (y, MPFR_GET_EXP (y) - BITS_PER_MP_LIMB);
+ exp -= BITS_PER_MP_LIMB;
}
/* now we have yn limbs starting from tmp[1], with tmp[yn]<>0 */
@@ -126,7 +127,7 @@ mpfr_div_ui (mpfr_ptr y, mpfr_srcptr x, unsigned long int u, mp_rnd_t rnd_mode)
yp[0] += tmp[0] >> (BITS_PER_MP_LIMB - sh);
middle = middle || ((tmp[0] << sh) != 0);
inexact = inexact || ((tmp[0] << sh) != 0);
- MPFR_SET_EXP (y, MPFR_GET_EXP (y) - sh);
+ exp -= sh;
}
else
MPN_COPY(yp, tmp + 1, yn);
@@ -137,6 +138,8 @@ mpfr_div_ui (mpfr_ptr y, mpfr_srcptr x, unsigned long int u, mp_rnd_t rnd_mode)
d = *yp & ((MP_LIMB_T_ONE << sh) - MP_LIMB_T_ONE);
*yp ^= d; /* set to zero lowest sh bits */
+ MPFR_SET_EXP (y, exp);
+
TMP_FREE(marker);
if ((d == 0) && (inexact == 0))
return 0; /* result is exact */
@@ -170,7 +173,8 @@ mpfr_div_ui (mpfr_ptr y, mpfr_srcptr x, unsigned long int u, mp_rnd_t rnd_mode)
(a) sh > 0 and inexact == 0
(b) sh=0 and middle=1
*/
- if ((sh && inexact) || (!sh && (middle > 0)) || (*yp & (MP_LIMB_T_ONE << sh)))
+ if ((sh && inexact) || (!sh && (middle > 0)) ||
+ (*yp & (MP_LIMB_T_ONE << sh)))
{
mpfr_add_one_ulp (y, rnd_mode);
MPFR_RET(MPFR_SIGN(x));
@@ -181,6 +185,3 @@ mpfr_div_ui (mpfr_ptr y, mpfr_srcptr x, unsigned long int u, mp_rnd_t rnd_mode)
}
MPFR_RET(inexact); /* should never go here */
}
-
-
-