diff options
author | pelissip <pelissip@280ebfd0-de03-0410-8827-d642c229c3f4> | 2005-03-08 08:57:00 +0000 |
---|---|---|
committer | pelissip <pelissip@280ebfd0-de03-0410-8827-d642c229c3f4> | 2005-03-08 08:57:00 +0000 |
commit | 5947328ea5908b0cea61c3fe9680ae8322a62b1d (patch) | |
tree | 591eb1827327961e03fa91cd05a304aaf115e9f2 /add1sp.c | |
parent | 521e97255c79f994149ca11670025c620b903705 (diff) | |
download | mpfr-5947328ea5908b0cea61c3fe9680ae8322a62b1d.tar.gz |
Fix bug in case of reuse of variable (a,b,a) with Exp(b)=Exp(a)+Prec(b).
Move copy of mantissa after test.
git-svn-id: svn://scm.gforge.inria.fr/svn/mpfr/trunk@3364 280ebfd0-de03-0410-8827-d642c229c3f4
Diffstat (limited to 'add1sp.c')
-rw-r--r-- | add1sp.c | 42 |
1 files changed, 23 insertions, 19 deletions
@@ -101,29 +101,34 @@ mpfr_add1sp (mpfr_ptr a, mpfr_srcptr b, mpfr_srcptr c, mp_rnd_t rnd_mode) else goto add_one_ulp; } - else if (MPFR_UNLIKELY(d >= p)) + else if (MPFR_UNLIKELY (d >= p)) { - if (MPFR_LIKELY(d > p)) + if (MPFR_LIKELY (d > p)) { /* d > p : Copy B in A */ - ap = MPFR_MANT(a); - MPN_COPY (ap, MPFR_MANT(b), n); /* Away: Add 1 Nearest: Trunc Zero: Trunc */ - if (MPFR_LIKELY(rnd_mode==GMP_RNDN)) - { inexact = -1; goto set_exponent; } - MPFR_UPDATE_RND_MODE(rnd_mode, MPFR_IS_NEG(b)); - if (rnd_mode==GMP_RNDZ) - { inexact = -1; goto set_exponent; } + if (MPFR_LIKELY (rnd_mode==GMP_RNDN + || MPFR_IS_LIKE_RNDZ (rnd_mode, MPFR_IS_NEG (b)))) + { + copy_set_exponent: + ap = MPFR_MANT (a); + MPN_COPY (ap, MPFR_MANT(b), n); + inexact = -1; + goto set_exponent; + } else - goto add_one_ulp; + { + copy_add_one_ulp: + ap = MPFR_MANT(a); + MPN_COPY (ap, MPFR_MANT(b), n); + goto add_one_ulp; + } } else { /* d==p : Copy B in A */ - ap = MPFR_MANT(a); - MPN_COPY (ap, MPFR_MANT(b), n); /* Away: Add 1 Nearest: Even Rule if C is a power of 2, else Add 1 Zero: Trunc */ @@ -139,17 +144,16 @@ mpfr_add1sp (mpfr_ptr a, mpfr_srcptr b, mpfr_srcptr c, mp_rnd_t rnd_mode) } while (k>=0 && cp[k]==0); if (MPFR_UNLIKELY(k<0)) /* Power of 2: Even rule */ - if ((ap[0]&(MPFR_LIMB_ONE<<sh))==0) - { inexact = -1; goto set_exponent; } + if ((MPFR_MANT (b)[0]&(MPFR_LIMB_ONE<<sh))==0) + goto copy_set_exponent; } /* Not a Power of 2 */ - goto add_one_ulp; + goto copy_add_one_ulp; } - MPFR_UPDATE_RND_MODE(rnd_mode, MPFR_IS_NEG(b)); - if (rnd_mode==GMP_RNDZ) - { inexact = -1; goto set_exponent; } + else if (MPFR_IS_LIKE_RNDZ (rnd_mode, MPFR_IS_NEG (b))) + goto copy_set_exponent; else - goto add_one_ulp; + goto copy_add_one_ulp; } } else |