summaryrefslogtreecommitdiff
path: root/add1sp.c
diff options
context:
space:
mode:
authorpelissip <pelissip@280ebfd0-de03-0410-8827-d642c229c3f4>2005-03-08 08:57:00 +0000
committerpelissip <pelissip@280ebfd0-de03-0410-8827-d642c229c3f4>2005-03-08 08:57:00 +0000
commit5947328ea5908b0cea61c3fe9680ae8322a62b1d (patch)
tree591eb1827327961e03fa91cd05a304aaf115e9f2 /add1sp.c
parent521e97255c79f994149ca11670025c620b903705 (diff)
downloadmpfr-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.c42
1 files changed, 23 insertions, 19 deletions
diff --git a/add1sp.c b/add1sp.c
index db74612fc..c772b87cd 100644
--- a/add1sp.c
+++ b/add1sp.c
@@ -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