diff options
author | zimmerma <zimmerma@280ebfd0-de03-0410-8827-d642c229c3f4> | 1999-07-05 09:42:20 +0000 |
---|---|---|
committer | zimmerma <zimmerma@280ebfd0-de03-0410-8827-d642c229c3f4> | 1999-07-05 09:42:20 +0000 |
commit | 66bc5ada68e1971249f994505850090734ad84a9 (patch) | |
tree | 77d8a179d58a0f934cf37411df729a91b2648a29 /div_ui.c | |
parent | 9ba9dd5a5a404c573e5498ba12212b06ec0a0db1 (diff) | |
download | mpfr-66bc5ada68e1971249f994505850090734ad84a9.tar.gz |
patch for GMP bug when UDIV_NEEDS_NORMALIZATION=1
git-svn-id: svn://scm.gforge.inria.fr/svn/mpfr/trunk@276 280ebfd0-de03-0410-8827-d642c229c3f4
Diffstat (limited to 'div_ui.c')
-rw-r--r-- | div_ui.c | 17 |
1 files changed, 14 insertions, 3 deletions
@@ -45,10 +45,18 @@ mpfr_div_ui(y, x, u, rnd_mode) if (ABSSIZE(y)>=yn+1) tmp=yp; else tmp=TMP_ALLOC((yn+1)*BYTES_PER_MP_LIMB); - if (dif>=0) - c = mpn_divrem_1(tmp, dif, xp, xn, (mp_limb_t) u); + c = (mp_limb_t) u; + if (dif>=0) { + /* patch for bug in mpn_divrem_1 */ +#if (UDIV_NEEDS_NORMALIZATION==1) + count_leading_zeros(sh, c); + c <<= sh; + EXP(y) += sh; +#endif + c = mpn_divrem_1(tmp, dif, xp, xn, c); + } else /* dif < 0 i.e. xn > yn */ - c = mpn_divrem_1(tmp, 0, xp-dif, yn, (mp_limb_t) u); + c = mpn_divrem_1(tmp, 0, xp-dif, yn, c); /* shift left to normalize */ count_leading_zeros(sh, tmp[yn]); @@ -102,3 +110,6 @@ printf("y="); mpfr_print_raw(y); putchar('\n'); } return 0; /* to prevent warning from gcc */ } + + + |