diff options
author | tege <tege@gmplib.org> | 1996-05-08 09:42:34 +0200 |
---|---|---|
committer | tege <tege@gmplib.org> | 1996-05-08 09:42:34 +0200 |
commit | 1b3800a70cb14a22a458594f31c896f7b7a42f93 (patch) | |
tree | 0ebf847260f4765d5411fded355fe7673fc0f571 /mpf/div.c | |
parent | 3dacca0bd7a2b73ff2d074ce18cdd3a78336ddf4 (diff) | |
download | gmp-1b3800a70cb14a22a458594f31c896f7b7a42f93.tar.gz |
Changes from tiny.
Diffstat (limited to 'mpf/div.c')
-rw-r--r-- | mpf/div.c | 73 |
1 files changed, 37 insertions, 36 deletions
@@ -34,20 +34,22 @@ mpf_div (r, u, v) #endif { mp_srcptr up, vp; - mp_ptr qp, rp, rrp; - mp_size_t usize = u->_mp_size; - mp_size_t vsize = v->_mp_size; - mp_size_t qsize, rsize; - mp_size_t sign_quotient = usize ^ vsize; + mp_ptr rp, tp, rtp; + mp_size_t usize, vsize; + mp_size_t rsize, tsize; + mp_size_t sign_quotient; + mp_size_t prec; unsigned normalization_steps; mp_limb_t q_limb; - mp_size_t prec; mp_exp_t rexp; TMP_DECL (marker); - prec = r->_mp_prec; + usize = u->_mp_size; + vsize = v->_mp_size; + sign_quotient = usize ^ vsize; usize = ABS (usize); vsize = ABS (vsize); + prec = r->_mp_prec; if (vsize == 0) vsize = 1 / vsize; /* divide by zero as directed */ @@ -61,7 +63,7 @@ mpf_div (r, u, v) TMP_MARK (marker); rexp = u->_mp_exp - v->_mp_exp; - qp = r->_mp_d; + rp = r->_mp_d; up = u->_mp_d; vp = v->_mp_d; @@ -71,20 +73,19 @@ mpf_div (r, u, v) vsize = prec; } - rsize = vsize + prec; - - rp = (mp_ptr) TMP_ALLOC ((rsize + 1) * BYTES_PER_MP_LIMB); + tsize = vsize + prec; + tp = (mp_ptr) TMP_ALLOC ((tsize + 1) * BYTES_PER_MP_LIMB); - if (usize > rsize) + if (usize > tsize) { - up += usize - rsize; - usize = rsize; - rrp = rp; + up += usize - tsize; + usize = tsize; + rtp = tp; } else { - MPN_ZERO (rp, rsize - usize); - rrp = rp + (rsize - usize); + MPN_ZERO (tp, tsize - usize); + rtp = tp + (tsize - usize); } count_leading_zeros (normalization_steps, vp[vsize - 1]); @@ -92,24 +93,24 @@ mpf_div (r, u, v) /* Normalize the divisor and the dividend. */ if (normalization_steps != 0) { - mp_ptr tp; + mp_ptr tmp; mp_limb_t nlimb; /* Shift up the divisor setting the most significant bit of - the most significant word. Use temporary storage not to clobber + the most significant limb. Use temporary storage not to clobber the original contents of the divisor. */ - tp = (mp_ptr) TMP_ALLOC (vsize * BYTES_PER_MP_LIMB); - mpn_lshift (tp, vp, vsize, normalization_steps); - vp = tp; + tmp = (mp_ptr) TMP_ALLOC (vsize * BYTES_PER_MP_LIMB); + mpn_lshift (tmp, vp, vsize, normalization_steps); + vp = tmp; /* Shift up the dividend, possibly introducing a new most significant word. Move the shifted dividend in the remainder - meanwhile. */ - nlimb = mpn_lshift (rrp, up, usize, normalization_steps); + at the same time. */ + nlimb = mpn_lshift (rtp, up, usize, normalization_steps); if (nlimb != 0) { - rrp[usize] = nlimb; - rsize++; + rtp[usize] = nlimb; + tsize++; rexp++; } } @@ -117,27 +118,27 @@ mpf_div (r, u, v) { /* The divisor is already normalized, as required. Copy it to temporary space if it overlaps with the quotient. */ - if (vp == qp) + if (vp - rp <= tsize - vsize) { - vp = (mp_ptr) TMP_ALLOC (vsize * BYTES_PER_MP_LIMB); - MPN_COPY ((mp_ptr) vp, qp, vsize); + mp_ptr tmp = (mp_ptr) TMP_ALLOC (vsize * BYTES_PER_MP_LIMB); + MPN_COPY (tmp, vp, vsize); + vp = (mp_srcptr) tmp; } /* Move the dividend to the remainder. */ - MPN_COPY (rrp, up, usize); + MPN_COPY (rtp, up, usize); } - q_limb = mpn_divmod (qp, rp, rsize, vp, vsize); - - qsize = rsize - vsize; + q_limb = mpn_divmod (rp, tp, tsize, vp, vsize); + rsize = tsize - vsize; if (q_limb) { - qp[qsize] = q_limb; - qsize++; + rp[rsize] = q_limb; + rsize++; rexp++; } - r->_mp_size = sign_quotient >= 0 ? qsize : -qsize; + r->_mp_size = sign_quotient >= 0 ? rsize : -rsize; r->_mp_exp = rexp; TMP_FREE (marker); } |