mirror of
https://github.com/Z3Prover/z3
synced 2025-04-15 21:38:44 +00:00
Bugfix for FP numeral construction and extraction.
This commit is contained in:
parent
c8931a7bba
commit
60f866e259
|
@ -931,13 +931,21 @@ extern "C" {
|
||||||
mpf_manager & mpfm = mk_c(c)->fpautil().fm();
|
mpf_manager & mpfm = mk_c(c)->fpautil().fm();
|
||||||
unsynch_mpz_manager & mpzm = mpfm.mpz_manager();
|
unsynch_mpz_manager & mpzm = mpfm.mpz_manager();
|
||||||
unsynch_mpq_manager & mpqm = mpfm.mpq_manager();
|
unsynch_mpq_manager & mpqm = mpfm.mpq_manager();
|
||||||
fpa_decl_plugin * plugin = (fpa_decl_plugin*)m.get_plugin(mk_c(c)->get_fpa_fid());
|
family_id fid = mk_c(c)->get_fpa_fid();
|
||||||
scoped_mpf val(mpfm);
|
fpa_decl_plugin * plugin = (fpa_decl_plugin*)m.get_plugin(fid);
|
||||||
if (!plugin->is_numeral(to_expr(t), val)) {
|
SASSERT(plugin != 0);
|
||||||
|
expr * e = to_expr(t);
|
||||||
|
if (!is_app(e) ||
|
||||||
|
is_app_of(e, fid, OP_FPA_NAN) ||
|
||||||
|
is_app_of(e, fid, OP_FPA_PLUS_INF) ||
|
||||||
|
is_app_of(e, fid, OP_FPA_MINUS_INF)) {
|
||||||
SET_ERROR_CODE(Z3_INVALID_ARG);
|
SET_ERROR_CODE(Z3_INVALID_ARG);
|
||||||
return "";
|
return "";
|
||||||
}
|
}
|
||||||
else if (!mpfm.is_regular(val)) {
|
scoped_mpf val(mpfm);
|
||||||
|
app * a = to_app(e);
|
||||||
|
bool r = plugin->is_numeral(e, val);
|
||||||
|
if (!r || !mpfm.is_regular(val)) {
|
||||||
SET_ERROR_CODE(Z3_INVALID_ARG)
|
SET_ERROR_CODE(Z3_INVALID_ARG)
|
||||||
return "";
|
return "";
|
||||||
}
|
}
|
||||||
|
@ -960,16 +968,25 @@ extern "C" {
|
||||||
ast_manager & m = mk_c(c)->m();
|
ast_manager & m = mk_c(c)->m();
|
||||||
mpf_manager & mpfm = mk_c(c)->fpautil().fm();
|
mpf_manager & mpfm = mk_c(c)->fpautil().fm();
|
||||||
unsynch_mpz_manager & mpzm = mpfm.mpz_manager();
|
unsynch_mpz_manager & mpzm = mpfm.mpz_manager();
|
||||||
fpa_decl_plugin * plugin = (fpa_decl_plugin*)m.get_plugin(mk_c(c)->get_fpa_fid());
|
family_id fid = mk_c(c)->get_fpa_fid();
|
||||||
scoped_mpf val(mpfm);
|
fpa_decl_plugin * plugin = (fpa_decl_plugin*)m.get_plugin(fid);
|
||||||
bool r = plugin->is_numeral(to_expr(t), val);
|
SASSERT(plugin != 0);
|
||||||
if (!r) {
|
expr * e = to_expr(t);
|
||||||
|
if (!is_app(e) ||
|
||||||
|
is_app_of(e, fid, OP_FPA_NAN) ||
|
||||||
|
is_app_of(e, fid, OP_FPA_PLUS_INF) ||
|
||||||
|
is_app_of(e, fid, OP_FPA_MINUS_INF)) {
|
||||||
SET_ERROR_CODE(Z3_INVALID_ARG);
|
SET_ERROR_CODE(Z3_INVALID_ARG);
|
||||||
|
*n = 0;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
scoped_mpf val(mpfm);
|
||||||
|
app * a = to_app(e);
|
||||||
|
bool r = plugin->is_numeral(e, val);
|
||||||
const mpz & z = mpfm.sig(val);
|
const mpz & z = mpfm.sig(val);
|
||||||
if (!mpzm.is_uint64(z)) {
|
if (!r || mpfm.is_regular(val)|| !mpzm.is_uint64(z)) {
|
||||||
SET_ERROR_CODE(Z3_INVALID_ARG);
|
SET_ERROR_CODE(Z3_INVALID_ARG);
|
||||||
|
*n = 0;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
*n = mpzm.get_uint64(z);
|
*n = mpzm.get_uint64(z);
|
||||||
|
@ -983,15 +1000,22 @@ extern "C" {
|
||||||
RESET_ERROR_CODE();
|
RESET_ERROR_CODE();
|
||||||
ast_manager & m = mk_c(c)->m();
|
ast_manager & m = mk_c(c)->m();
|
||||||
mpf_manager & mpfm = mk_c(c)->fpautil().fm();
|
mpf_manager & mpfm = mk_c(c)->fpautil().fm();
|
||||||
|
family_id fid = mk_c(c)->get_fpa_fid();
|
||||||
fpa_decl_plugin * plugin = (fpa_decl_plugin*)m.get_plugin(mk_c(c)->get_fpa_fid());
|
fpa_decl_plugin * plugin = (fpa_decl_plugin*)m.get_plugin(mk_c(c)->get_fpa_fid());
|
||||||
scoped_mpf val(mpfm);
|
SASSERT(plugin != 0);
|
||||||
bool r = plugin->is_numeral(to_expr(t), val);
|
expr * e = to_expr(t);
|
||||||
if (!r) {
|
if (!is_app(e) ||
|
||||||
|
is_app_of(e, fid, OP_FPA_NAN) ||
|
||||||
|
is_app_of(e, fid, OP_FPA_PLUS_INF) ||
|
||||||
|
is_app_of(e, fid, OP_FPA_MINUS_INF)) {
|
||||||
SET_ERROR_CODE(Z3_INVALID_ARG);
|
SET_ERROR_CODE(Z3_INVALID_ARG);
|
||||||
return "";
|
return "";
|
||||||
}
|
}
|
||||||
else if (!mpfm.is_normal(val) && !mpfm.is_denormal(val)) {
|
scoped_mpf val(mpfm);
|
||||||
SET_ERROR_CODE(Z3_INVALID_ARG)
|
app * a = to_app(e);
|
||||||
|
bool r = plugin->is_numeral(e, val);
|
||||||
|
if (!r || !mpfm.is_regular(val)) {
|
||||||
|
SET_ERROR_CODE(Z3_INVALID_ARG);
|
||||||
return "";
|
return "";
|
||||||
}
|
}
|
||||||
mpf_exp_t exp = mpfm.exp_normalized(val);
|
mpf_exp_t exp = mpfm.exp_normalized(val);
|
||||||
|
@ -1007,11 +1031,24 @@ extern "C" {
|
||||||
RESET_ERROR_CODE();
|
RESET_ERROR_CODE();
|
||||||
ast_manager & m = mk_c(c)->m();
|
ast_manager & m = mk_c(c)->m();
|
||||||
mpf_manager & mpfm = mk_c(c)->fpautil().fm();
|
mpf_manager & mpfm = mk_c(c)->fpautil().fm();
|
||||||
|
family_id fid = mk_c(c)->get_fpa_fid();
|
||||||
fpa_decl_plugin * plugin = (fpa_decl_plugin*)m.get_plugin(mk_c(c)->get_fpa_fid());
|
fpa_decl_plugin * plugin = (fpa_decl_plugin*)m.get_plugin(mk_c(c)->get_fpa_fid());
|
||||||
scoped_mpf val(mpfm);
|
SASSERT(plugin != 0);
|
||||||
bool r = plugin->is_numeral(to_expr(t), val);
|
expr * e = to_expr(t);
|
||||||
if (!r) {
|
if (!is_app(e) ||
|
||||||
|
is_app_of(e, fid, OP_FPA_NAN) ||
|
||||||
|
is_app_of(e, fid, OP_FPA_PLUS_INF) ||
|
||||||
|
is_app_of(e, fid, OP_FPA_MINUS_INF)) {
|
||||||
SET_ERROR_CODE(Z3_INVALID_ARG);
|
SET_ERROR_CODE(Z3_INVALID_ARG);
|
||||||
|
*n = 0;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
scoped_mpf val(mpfm);
|
||||||
|
app * a = to_app(e);
|
||||||
|
bool r = plugin->is_numeral(e, val);
|
||||||
|
if (!r || !mpfm.is_regular(val)) {
|
||||||
|
SET_ERROR_CODE(Z3_INVALID_ARG);
|
||||||
|
*n = 0;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
*n = mpfm.exp(val);
|
*n = mpfm.exp(val);
|
||||||
|
|
|
@ -69,28 +69,30 @@ void fpa_decl_plugin::recycled_id(unsigned id) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func_decl * fpa_decl_plugin::mk_numeral_decl(mpf const & v) {
|
func_decl * fpa_decl_plugin::mk_numeral_decl(mpf const & v) {
|
||||||
|
sort * s = mk_float_sort(v.get_ebits(), v.get_sbits());
|
||||||
|
func_decl * r = 0;
|
||||||
|
if (m_fm.is_nan(v))
|
||||||
|
r = m_manager->mk_const_decl(symbol("NaN"), s, func_decl_info(m_family_id, OP_FPA_NAN));
|
||||||
|
else if (m_fm.is_pinf(v))
|
||||||
|
r = m_manager->mk_const_decl(symbol("+oo"), s, func_decl_info(m_family_id, OP_FPA_PLUS_INF));
|
||||||
|
else if (m_fm.is_ninf(v))
|
||||||
|
r = m_manager->mk_const_decl(symbol("-oo"), s, func_decl_info(m_family_id, OP_FPA_MINUS_INF));
|
||||||
|
else if (m_fm.is_pzero(v))
|
||||||
|
r = m_manager->mk_const_decl(symbol("+zero"), s, func_decl_info(m_family_id, OP_FPA_PLUS_ZERO));
|
||||||
|
else if (m_fm.is_nzero(v))
|
||||||
|
r = m_manager->mk_const_decl(symbol("-zero"), s, func_decl_info(m_family_id, OP_FPA_MINUS_ZERO));
|
||||||
|
else {
|
||||||
|
SASSERT(m_fm.is_regular(v));
|
||||||
parameter p(mk_id(v), true);
|
parameter p(mk_id(v), true);
|
||||||
SASSERT(p.is_external());
|
SASSERT(p.is_external());
|
||||||
sort * s = mk_float_sort(v.get_ebits(), v.get_sbits());
|
sort * s = mk_float_sort(v.get_ebits(), v.get_sbits());
|
||||||
return m_manager->mk_const_decl(symbol("fp.numeral"), s, func_decl_info(m_family_id, OP_FPA_NUM, 1, &p));
|
r = m_manager->mk_const_decl(symbol("fp.numeral"), s, func_decl_info(m_family_id, OP_FPA_NUM, 1, &p));
|
||||||
|
}
|
||||||
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
app * fpa_decl_plugin::mk_numeral(mpf const & v) {
|
app * fpa_decl_plugin::mk_numeral(mpf const & v) {
|
||||||
sort * s = mk_float_sort(v.get_ebits(), v.get_sbits());
|
return m_manager->mk_const(mk_numeral_decl(v));
|
||||||
func_decl * d;
|
|
||||||
if (m_fm.is_nan(v))
|
|
||||||
d = m_manager->mk_const_decl(symbol("NaN"), s, func_decl_info(m_family_id, OP_FPA_NAN));
|
|
||||||
else if (m_fm.is_pinf(v))
|
|
||||||
d = m_manager->mk_const_decl(symbol("+oo"), s, func_decl_info(m_family_id, OP_FPA_PLUS_INF));
|
|
||||||
else if (m_fm.is_ninf(v))
|
|
||||||
d = m_manager->mk_const_decl(symbol("-oo"), s, func_decl_info(m_family_id, OP_FPA_MINUS_INF));
|
|
||||||
else if (m_fm.is_pzero(v))
|
|
||||||
d = m_manager->mk_const_decl(symbol("+zero"), s, func_decl_info(m_family_id, OP_FPA_PLUS_ZERO));
|
|
||||||
else if (m_fm.is_nzero(v))
|
|
||||||
d = m_manager->mk_const_decl(symbol("-zero"), s, func_decl_info(m_family_id, OP_FPA_MINUS_ZERO));
|
|
||||||
else
|
|
||||||
d = mk_numeral_decl(v);
|
|
||||||
return m_manager->mk_const(d);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool fpa_decl_plugin::is_numeral(expr * n, mpf & val) {
|
bool fpa_decl_plugin::is_numeral(expr * n, mpf & val) {
|
||||||
|
|
Loading…
Reference in a new issue