summaryrefslogtreecommitdiff
path: root/div_ui.c
diff options
context:
space:
mode:
authorzimmerma <zimmerma@280ebfd0-de03-0410-8827-d642c229c3f4>1999-07-05 09:42:20 +0000
committerzimmerma <zimmerma@280ebfd0-de03-0410-8827-d642c229c3f4>1999-07-05 09:42:20 +0000
commit66bc5ada68e1971249f994505850090734ad84a9 (patch)
tree77d8a179d58a0f934cf37411df729a91b2648a29 /div_ui.c
parent9ba9dd5a5a404c573e5498ba12212b06ec0a0db1 (diff)
downloadmpfr-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.c17
1 files changed, 14 insertions, 3 deletions
diff --git a/div_ui.c b/div_ui.c
index 700e7d19b..17697472f 100644
--- a/div_ui.c
+++ b/div_ui.c
@@ -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 */
}
+
+
+