summaryrefslogtreecommitdiff
path: root/src/fma.c
diff options
context:
space:
mode:
authorzimmerma <zimmerma@280ebfd0-de03-0410-8827-d642c229c3f4>2017-12-19 06:51:47 +0000
committerzimmerma <zimmerma@280ebfd0-de03-0410-8827-d642c229c3f4>2017-12-19 06:51:47 +0000
commitebe236a970ecbadbbe9790d4aed62a1f24407f7c (patch)
tree4f24199ded85cad4fa449745ad301f697e54c730 /src/fma.c
parent81c69f01f0200536cfc2d38977f6950112c40c6e (diff)
downloadmpfr-ebe236a970ecbadbbe9790d4aed62a1f24407f7c.tar.gz
[src/fma.c] fixed bug in mpfr_fma
[tests/tfma.c] added non-regression test git-svn-id: svn://scm.gforge.inria.fr/svn/mpfr/trunk@12012 280ebfd0-de03-0410-8827-d642c229c3f4
Diffstat (limited to 'src/fma.c')
-rw-r--r--src/fma.c5
1 files changed, 4 insertions, 1 deletions
diff --git a/src/fma.c b/src/fma.c
index 958176035..4e1eeaaf5 100644
--- a/src/fma.c
+++ b/src/fma.c
@@ -129,7 +129,8 @@ mpfr_fma (mpfr_ptr s, mpfr_srcptr x, mpfr_srcptr y, mpfr_srcptr z,
|EXP(x)+EXP(y)| < 2^(k-1), thus cannot overflow nor underflow. */
if (MPFR_PREC(x) == MPFR_PREC(y) && e <= __gmpfr_emax && e > __gmpfr_emin)
{
- if (MPFR_PREC(x) < GMP_NUMB_BITS && MPFR_PREC(z) == MPFR_PREC(x))
+ if (MPFR_PREC(x) < GMP_NUMB_BITS && MPFR_PREC(z) == MPFR_PREC(x) &&
+ MPFR_PREC(s) == MPFR_PREC(x))
{
mp_limb_t umant[2], zmant[2];
mpfr_t zz;
@@ -170,6 +171,8 @@ mpfr_fma (mpfr_ptr s, mpfr_srcptr x, mpfr_srcptr y, mpfr_srcptr z,
MPFR_EXP(u) = e;
}
inex = mpfr_add (u, u, zz, rnd_mode);
+ /* mpfr_set_1_2 requires PREC(u) = 2*PREC(s),
+ thus we need PREC(s) = PREC(x) = PREC(y) = PREC(z) */
return mpfr_set_1_2 (s, u, rnd_mode, inex);
}
else if ((n = MPFR_LIMB_SIZE(x)) <= 4 * MPFR_MUL_THRESHOLD)