3
0
Fork 0
mirror of https://github.com/Z3Prover/z3 synced 2026-03-20 03:53:10 +00:00

Merge pull request #8748 from Z3Prover/copilot/fix-floating-point-model-validation

Fix fp.to_real bitvector encoding for denormal floating-point values
This commit is contained in:
Nikolaj Bjorner 2026-02-26 02:21:20 -08:00 committed by GitHub
commit 070f760501
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
4 changed files with 90 additions and 3 deletions

View file

@ -2953,12 +2953,16 @@ void fpa2bv_converter::mk_to_real(func_decl * f, unsigned num, expr * const * ar
dbg_decouple("fpa2bv_to_real_rsig", rsig);
expr_ref exp_n(m), exp_p(m), exp_is_neg(m), exp_abs(m);
exp_is_neg = m.mk_eq(m_bv_util.mk_extract(ebits - 1, ebits - 1, exp), bv1);
dbg_decouple("fpa2bv_to_real_exp_is_neg", exp_is_neg);
exp_p = m_bv_util.mk_sign_extend(1, exp);
// Subtract the normalization shift for denormals (lz is 0 for normals)
expr_ref lz_ext(m);
lz_ext = m_bv_util.mk_zero_extend(1, lz);
exp_p = m_bv_util.mk_bv_sub(exp_p, lz_ext);
exp_is_neg = m.mk_eq(m_bv_util.mk_extract(ebits, ebits, exp_p), bv1);
dbg_decouple("fpa2bv_to_real_exp_is_neg", exp_is_neg);
exp_n = m_bv_util.mk_bv_neg(exp_p);
exp_abs = m.mk_ite(exp_is_neg, exp_n, exp_p);
dbg_decouple("fpa2bv_to_real_exp_abs", exp);
dbg_decouple("fpa2bv_to_real_exp_abs", exp_abs);
SASSERT(m_bv_util.get_bv_size(exp_abs) == ebits + 1);
expr_ref exp2(m), exp2_mul_2(m), prev_bit(m);