@@ -192,7 +192,6 @@ extern "C" {
192
192
return mk_c (c)->mk_external_string (r.to_string ());
193
193
}
194
194
else {
195
- // floats are separated from all others to avoid huge rationals.
196
195
fpa_util & fu = mk_c (c)->fpautil ();
197
196
scoped_mpf tmp (fu.fm ());
198
197
mpf_rounding_mode rm;
@@ -217,7 +216,9 @@ extern "C" {
217
216
}
218
217
}
219
218
else if (mk_c (c)->fpautil ().is_numeral (to_expr (a), tmp)) {
220
- return mk_c (c)->mk_external_string (fu.fm ().to_string (tmp));
219
+ std::ostringstream buffer;
220
+ fu.fm ().display_smt2 (buffer, tmp, false );
221
+ return mk_c (c)->mk_external_string (buffer.str ());
221
222
}
222
223
else {
223
224
SET_ERROR_CODE (Z3_INVALID_ARG, nullptr );
@@ -254,6 +255,9 @@ extern "C" {
254
255
expr* e = to_expr (a);
255
256
rational r;
256
257
arith_util & u = mk_c (c)->autil ();
258
+ fpa_util & fu = mk_c (c)->fpautil ();
259
+ scoped_mpf ftmp (fu.fm ());
260
+ mpf_rounding_mode rm;
257
261
if (u.is_numeral (e, r) && !r.is_int ()) {
258
262
std::ostringstream buffer;
259
263
r.display_decimal (buffer, precision);
@@ -266,8 +270,14 @@ extern "C" {
266
270
am.display_decimal (buffer, n, precision);
267
271
return mk_c (c)->mk_external_string (buffer.str ());
268
272
}
269
- bool ok = Z3_get_numeral_rational (c, a, r);
270
- if (ok) {
273
+ else if (mk_c (c)->fpautil ().is_rm_numeral (to_expr (a), rm))
274
+ return Z3_get_numeral_string (c, a);
275
+ else if (mk_c (c)->fpautil ().is_numeral (to_expr (a), ftmp)) {
276
+ std::ostringstream buffer;
277
+ fu.fm ().display_decimal (buffer, ftmp, 12 );
278
+ return mk_c (c)->mk_external_string (buffer.str ());
279
+ }
280
+ else if (Z3_get_numeral_rational (c, a, r)) {
271
281
return mk_c (c)->mk_external_string (r.to_string ());
272
282
}
273
283
else {
0 commit comments