diff options
author | zimmerma <zimmerma@280ebfd0-de03-0410-8827-d642c229c3f4> | 2017-12-19 06:51:47 +0000 |
---|---|---|
committer | zimmerma <zimmerma@280ebfd0-de03-0410-8827-d642c229c3f4> | 2017-12-19 06:51:47 +0000 |
commit | ebe236a970ecbadbbe9790d4aed62a1f24407f7c (patch) | |
tree | 4f24199ded85cad4fa449745ad301f697e54c730 /src | |
parent | 81c69f01f0200536cfc2d38977f6950112c40c6e (diff) | |
download | mpfr-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')
-rw-r--r-- | src/fma.c | 5 |
1 files changed, 4 insertions, 1 deletions
@@ -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) |