3
0
Fork 0
mirror of https://github.com/Z3Prover/z3 synced 2025-07-20 19:32:04 +00:00

FPA: new conversion

Signed-off-by: Christoph M. Wintersteiger <cwinter@microsoft.com>
This commit is contained in:
Christoph M. Wintersteiger 2014-12-21 18:45:05 +00:00
parent a1b4ef9e1b
commit d394b9579f

View file

@ -109,11 +109,14 @@ br_status float_rewriter::mk_to_fp(func_decl * f, unsigned num_args, expr * cons
else else
return BR_FAILED; return BR_FAILED;
} }
else if (num_args == 3 && else if (num_args == 3) {
m_util.is_rm(args[0]) && bv_util bu(m());
rational r1, r2, r3;
unsigned bvs1, bvs2, bvs3;
if (m_util.is_rm(args[0]) &&
m_util.au().is_real(args[1]) && m_util.au().is_real(args[1]) &&
m_util.au().is_int(args[2])) { m_util.au().is_int(args[2])) {
mpf_rounding_mode rm; mpf_rounding_mode rm;
if (!m_util.is_rm_value(args[0], rm)) if (!m_util.is_rm_value(args[0], rm))
return BR_FAILED; return BR_FAILED;
@ -133,9 +136,27 @@ br_status float_rewriter::mk_to_fp(func_decl * f, unsigned num_args, expr * cons
m_util.fm().del(v); m_util.fm().del(v);
return BR_DONE; return BR_DONE;
} }
else { else if (bu.is_numeral(args[0], r1, bvs1) &&
bu.is_numeral(args[1], r2, bvs2) &&
bu.is_numeral(args[2], r3, bvs3)) {
SASSERT(m_util.fm().mpz_manager().is_one(r2.to_mpq().denominator()));
SASSERT(m_util.fm().mpz_manager().is_one(r3.to_mpq().denominator()));
SASSERT(m_util.fm().mpz_manager().is_int64(r3.to_mpq().numerator()));
scoped_mpf v(m_util.fm());
mpf_exp_t biased_exp = m_util.fm().mpz_manager().get_int64(r2.to_mpq().numerator());
m_util.fm().set(v, bvs2, bvs3 + 1,
r1.is_one(),
r3.to_mpq().numerator(),
m_util.fm().unbias_exp(bvs2, biased_exp));
TRACE("fp_rewriter", tout << "v = " << m_util.fm().to_string(v) << std::endl;);
result = m_util.mk_value(v);
return BR_DONE;
}
else
return BR_FAILED; return BR_FAILED;
} }
else
return BR_FAILED;
} }
br_status float_rewriter::mk_to_fp_unsigned(func_decl * f, unsigned num_args, expr * const * args, expr_ref & result) { br_status float_rewriter::mk_to_fp_unsigned(func_decl * f, unsigned num_args, expr * const * args, expr_ref & result) {