From d6e2fa6a606a6592c9bcb2c7675b5eb9f1a2371e Mon Sep 17 00:00:00 2001 From: "Christoph M. Wintersteiger" <cwinter@microsoft.com> Date: Mon, 14 Sep 2015 14:07:11 +0100 Subject: [PATCH] Bugfix for MPF fma. --- src/util/mpf.cpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/util/mpf.cpp b/src/util/mpf.cpp index 36974519c..6d51b68ce 100644 --- a/src/util/mpf.cpp +++ b/src/util/mpf.cpp @@ -877,10 +877,11 @@ void mpf_manager::fma(mpf_rounding_mode rm, mpf const & x, mpf const & y, mpf co // Remove the extra bits, keeping a sticky bit. m_mpz_manager.set(sticky_rem, 0); - if (o.sbits >= (4+extra)) - m_mpz_manager.machine_div_rem(o.significand, m_powers2(4+extra), o.significand, sticky_rem); + unsigned minbits = (4 + extra); + if (o.sbits >= minbits) + m_mpz_manager.machine_div_rem(o.significand, m_powers2(o.sbits - minbits), o.significand, sticky_rem); else - m_mpz_manager.mul2k(o.significand, (4+extra) - o.sbits, o.significand); + m_mpz_manager.mul2k(o.significand, minbits - o.sbits, o.significand); if (!m_mpz_manager.is_zero(sticky_rem) && m_mpz_manager.is_even(o.significand)) m_mpz_manager.inc(o.significand);