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

时间:2018-02-22 14:37:40

标签: c++ floating-point z3

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

我陷入了一个非常愚蠢的问题。我在QF_FP逻辑中有一个求解器,并且求解器能够返回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转换器。

但我似乎无法找出/找出任何会将此值返回给我的函数。是否有任何内置函数,如 Z3_get_numeral_uint64(...),它返回一个实数值,或者即使它分别返回分子和分母,它也有效。

感谢。

1 个答案:

答案 0 :(得分:2)

(fp #...) SMT FloatingPoint理论定义的值/数字。它是精确的并且避免了舍入和/或截断的实数表达式带来的任何问题。例如。将此值转换为double将需要至少一次舍入,并将具有大指数的浮点数转换为十进制实数表示可能是巨大的。

您可以使用Z3_fpa_get_numeral_*函数将单独的符号,有效数和指数值提取为位向量,字符串或int64,但应由应用程序组合和/或近似它们。

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