X-Git-Url: https://git.distorted.org.uk/u/mdw/catacomb/blobdiff_plain/42684bdb717221e41ad97cfefed2242e0553f835..c760149fcb65296defd1af967fbfa098bd83143a:/mpx.c diff --git a/mpx.c b/mpx.c index e63750f..327699c 100644 --- a/mpx.c +++ b/mpx.c @@ -1,6 +1,6 @@ /* -*-c-*- * - * $Id: mpx.c,v 1.6 1999/11/20 22:43:44 mdw Exp $ + * $Id: mpx.c,v 1.9 2000/06/26 07:52:50 mdw Exp $ * * Low-level multiprecision arithmetic * @@ -30,6 +30,15 @@ /*----- Revision history --------------------------------------------------* * * $Log: mpx.c,v $ + * Revision 1.9 2000/06/26 07:52:50 mdw + * Portability fix for the bug fix. + * + * Revision 1.8 2000/06/25 12:59:02 mdw + * (mpx_udiv): Fix bug in quotient digit estimation. + * + * Revision 1.7 1999/12/22 15:49:07 mdw + * New function for division by a small integer. + * * Revision 1.6 1999/11/20 22:43:44 mdw * Integrate testing for MPX routines. * @@ -821,21 +830,19 @@ void mpx_udiv(mpw *qv, mpw *qvl, mpw *rv, mpw *rvl, { mpd yh = (mpd)d * q; - mpd yl = (mpd)dd * q; + mpd yy = (mpd)dd * q; + mpw yl; - if (yl > MPW_MAX) { - yh += yl >> MPW_BITS; - yl &= MPW_MAX; - } + if (yy > MPW_MAX) + yh += yy >> MPW_BITS; + yl = MPW(yy); while (yh > rh || (yh == rh && yl > rrr)) { q--; yh -= d; - if (yl < dd) { - yh++; - yl += MPW_MAX; - } - yl -= dd; + if (yl < dd) + yh--; + yl = MPW(yl - dd); } } @@ -900,6 +907,35 @@ void mpx_udiv(mpw *qv, mpw *qvl, mpw *rv, mpw *rvl, mpx_lsr(rv, rvl, rv, rvl, norm); } +/* --- @mpx_udivn@ --- * + * + * Arguments: @mpw *qv, *qvl@ = storage for the quotient (may overlap + * dividend) + * @const mpw *rv, *rvl@ = dividend + * @mpw d@ = single-precision divisor + * + * Returns: Remainder after divison. + * + * Use: Performs a single-precision division operation. + */ + +mpw mpx_udivn(mpw *qv, mpw *qvl, const mpw *rv, const mpw *rvl, mpw d) +{ + size_t i; + size_t ql = qvl - qv; + mpd r = 0; + + i = rvl - rv; + while (i > 0) { + i--; + r = (r << MPW_BITS) | rv[i]; + if (i < ql) + qv[i] = r / d; + r %= d; + } + return (MPW(r)); +} + /*----- Test rig ----------------------------------------------------------*/ #ifdef TEST_RIG