diff options
author | vlefevre <vlefevre@280ebfd0-de03-0410-8827-d642c229c3f4> | 2001-10-18 17:29:45 +0000 |
---|---|---|
committer | vlefevre <vlefevre@280ebfd0-de03-0410-8827-d642c229c3f4> | 2001-10-18 17:29:45 +0000 |
commit | ff9eb7a98a631caf1caedfd56470dccd04ce5b3a (patch) | |
tree | cb8a93321afa052741d2170f7e872762b38b48fd /round.c | |
parent | 5582ce5c435fef2ecbcd5a897ec2035b407d8474 (diff) | |
download | mpfr-ff9eb7a98a631caf1caedfd56470dccd04ce5b3a.tar.gz |
Code clean-up in mpfr_round_raw (well... IMHO).
git-svn-id: svn://scm.gforge.inria.fr/svn/mpfr/trunk@1302 280ebfd0-de03-0410-8827-d642c229c3f4
Diffstat (limited to 'round.c')
-rw-r--r-- | round.c | 17 |
1 files changed, 10 insertions, 7 deletions
@@ -161,7 +161,7 @@ mpfr_round_raw (yp, xp, xprec, neg, yprec, rnd_mode, inexp) } else { - mp_limb_t rb = 0, sb; + mp_limb_t sb; if ((rnd_mode == GMP_RNDU && neg) || (rnd_mode == GMP_RNDD && !neg)) @@ -170,7 +170,6 @@ mpfr_round_raw (yp, xp, xprec, neg, yprec, rnd_mode, inexp) if (inexp || rnd_mode != GMP_RNDZ) { mp_size_t k; - mp_limb_t rbmask; k = xsize - nw; if (!rw) k--; @@ -178,15 +177,19 @@ mpfr_round_raw (yp, xp, xprec, neg, yprec, rnd_mode, inexp) sb = xp[k] & lomask; /* First non-significant bits */ if (rnd_mode == GMP_RNDN) { - rbmask = ((mp_limb_t)1) << (BITS_PER_MP_LIMB - rw - 1); - rb = sb & rbmask; - sb &= ~rbmask; + mp_limb_t rbmask = ((mp_limb_t)1) << (BITS_PER_MP_LIMB - rw - 1); + if (sb & rbmask) /* rounding bit */ + sb &= ~rbmask; /* it is 1, clear it */ + else + rnd_mode = GMP_RNDZ; /* it is 0, behave like rounding to 0 */ } while (sb == 0 && k > 0) sb = xp[--k]; - if (rnd_mode == GMP_RNDN && (rb != 0 || sb != 0)) + if (rnd_mode == GMP_RNDN) { - sb = sb == 0 ? xp[xsize - nw] & (himask ^ (himask << 1)) : rb; + /* rounding bit is 1 */ + if (sb == 0) /* round to even... */ + sb = xp[xsize - nw] & (himask ^ (himask << 1)); if (inexp) *inexp = ((neg != 0) ^ (sb != 0)) ? 1 : -1; } |