Z3 SMT Solver - 如何在 FPA 中提取浮点数的值?

Z3 SMT Solver - How can I extract the value of a floating point number in FPA?

我在 linux 机器上使用 Z3-4.6.0 C/C++ API。

我陷入了一个非常愚蠢的问题。我有一个 QF_FP 逻辑求解器,求解器能够 return SAT 解决输入问题。

当我做

  z3::model model = z3_solver_.get_model();

我明白了

(define-fun var_1 () (_ FloatingPoint 11 53)
(fp #b0 #b10000000001 #x3333333333333))

然后调用 eval

z3::expr r = model.eval(z3::expr(var_expr), true);

然后我得到

(fp #b0 #b10000000001 #x3333333333333)

我知道答案是正确的,因为我通过在线 IEEE-754 转换器进行了检查。

但我似乎无法 out/find 找出任何函数 return 这个值对我来说。是否有像 Z3_get_numeral_uint64 (...) 这样的内置函数,其中 return 是一个实数值,或者即使它 return 是分子和分母分开,这也有效。

谢谢。

(fp #...) SMT浮点理论定义的value/numeral。它是精确的并且避免了舍入 and/or 截断 real-numbered 表达式带来的任何问题。例如。将此值转换为 double 将需要至少一次舍入,并将具有大指数的浮点数转换为 decimal-real 表示可能会很大。

您可以使用 Z3_fpa_get_numeral_* 函数将单独的符号、尾数和指数值提取为 bit-vectors、字符串或 int64,但由应用程序将 and/or 近似它们。

此外,还有一个名为 pp.fp_real_literals 的参数可以为模型值启用 real/decimal 编号表示,Z3_get_numeral_string 应该遵守该参数。这些也分为有效数和指数,但它们可以简化调试。