From f2ff0712249dde9f394d15de99ab01b8d40c831c Mon Sep 17 00:00:00 2001
From: "Christoph M. Wintersteiger" <cwinter@microsoft.com>
Date: Wed, 7 Oct 2015 20:17:04 +0100
Subject: [PATCH 1/2] Bugfix for mpf to_ieee_bv

---
 src/util/mpf.cpp | 9 +++++++--
 src/util/mpf.h   | 1 +
 2 files changed, 8 insertions(+), 2 deletions(-)

diff --git a/src/util/mpf.cpp b/src/util/mpf.cpp
index 855668e5a..e56e0ce87 100644
--- a/src/util/mpf.cpp
+++ b/src/util/mpf.cpp
@@ -1176,12 +1176,14 @@ void mpf_manager::to_sbv_mpq(mpf_rounding_mode rm, const mpf & x, scoped_mpq & o
 void mpf_manager::to_ieee_bv_mpz(const mpf & x, scoped_mpz & o) {
     SASSERT(!is_nan(x) && !is_inf(x));
     SASSERT(exp(x) < INT_MAX);
-
+       
     unsigned sbits = x.get_sbits();
     unsigned ebits = x.get_ebits();
+    scoped_mpz biased_exp(m_mpz_manager);
+    m_mpz_manager.set(biased_exp, bias_exp(ebits, exp(x)));
     m_mpz_manager.set(o, sgn(x));
     m_mpz_manager.mul2k(o, ebits);
-    m_mpz_manager.add(o, (int)exp(x), o);
+    m_mpz_manager.add(o, biased_exp, o);
     m_mpz_manager.mul2k(o, sbits - 1);
     m_mpz_manager.add(o, sig(x), o);
 }
@@ -1519,6 +1521,9 @@ mpf_exp_t mpf_manager::mk_max_exp(unsigned ebits) {
     return m_mpz_manager.get_int64(m_powers2.m1(ebits-1, false));
 }
 
+mpf_exp_t mpf_manager::bias_exp(unsigned ebits, mpf_exp_t unbiased_exponent) {
+    return unbiased_exponent + m_mpz_manager.get_int64(m_powers2.m1(ebits - 1, false));
+}
 mpf_exp_t mpf_manager::unbias_exp(unsigned ebits, mpf_exp_t biased_exponent) {
     return biased_exponent - m_mpz_manager.get_int64(m_powers2.m1(ebits - 1, false));
 }
diff --git a/src/util/mpf.h b/src/util/mpf.h
index 1e934275f..0e9d3e89c 100644
--- a/src/util/mpf.h
+++ b/src/util/mpf.h
@@ -197,6 +197,7 @@ public:
     mpf_exp_t mk_max_exp(unsigned ebits);
     mpf_exp_t mk_min_exp(unsigned ebits);
 
+    mpf_exp_t bias_exp(unsigned ebits, mpf_exp_t unbiased_exponent);
     mpf_exp_t unbias_exp(unsigned ebits, mpf_exp_t biased_exponent);
 
     /**

From fcf036695e603a8b927676d4e3661c492837f7e9 Mon Sep 17 00:00:00 2001
From: "Christoph M. Wintersteiger" <cwinter@microsoft.com>
Date: Wed, 7 Oct 2015 20:17:04 +0100
Subject: [PATCH 2/2] Bugfix for mpf to_ieee_bv

---
 src/util/mpf.cpp | 9 +++++++--
 src/util/mpf.h   | 1 +
 2 files changed, 8 insertions(+), 2 deletions(-)

diff --git a/src/util/mpf.cpp b/src/util/mpf.cpp
index 855668e5a..e56e0ce87 100644
--- a/src/util/mpf.cpp
+++ b/src/util/mpf.cpp
@@ -1176,12 +1176,14 @@ void mpf_manager::to_sbv_mpq(mpf_rounding_mode rm, const mpf & x, scoped_mpq & o
 void mpf_manager::to_ieee_bv_mpz(const mpf & x, scoped_mpz & o) {
     SASSERT(!is_nan(x) && !is_inf(x));
     SASSERT(exp(x) < INT_MAX);
-
+       
     unsigned sbits = x.get_sbits();
     unsigned ebits = x.get_ebits();
+    scoped_mpz biased_exp(m_mpz_manager);
+    m_mpz_manager.set(biased_exp, bias_exp(ebits, exp(x)));
     m_mpz_manager.set(o, sgn(x));
     m_mpz_manager.mul2k(o, ebits);
-    m_mpz_manager.add(o, (int)exp(x), o);
+    m_mpz_manager.add(o, biased_exp, o);
     m_mpz_manager.mul2k(o, sbits - 1);
     m_mpz_manager.add(o, sig(x), o);
 }
@@ -1519,6 +1521,9 @@ mpf_exp_t mpf_manager::mk_max_exp(unsigned ebits) {
     return m_mpz_manager.get_int64(m_powers2.m1(ebits-1, false));
 }
 
+mpf_exp_t mpf_manager::bias_exp(unsigned ebits, mpf_exp_t unbiased_exponent) {
+    return unbiased_exponent + m_mpz_manager.get_int64(m_powers2.m1(ebits - 1, false));
+}
 mpf_exp_t mpf_manager::unbias_exp(unsigned ebits, mpf_exp_t biased_exponent) {
     return biased_exponent - m_mpz_manager.get_int64(m_powers2.m1(ebits - 1, false));
 }
diff --git a/src/util/mpf.h b/src/util/mpf.h
index 1e934275f..0e9d3e89c 100644
--- a/src/util/mpf.h
+++ b/src/util/mpf.h
@@ -197,6 +197,7 @@ public:
     mpf_exp_t mk_max_exp(unsigned ebits);
     mpf_exp_t mk_min_exp(unsigned ebits);
 
+    mpf_exp_t bias_exp(unsigned ebits, mpf_exp_t unbiased_exponent);
     mpf_exp_t unbias_exp(unsigned ebits, mpf_exp_t biased_exponent);
 
     /**