我在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(...),它返回一个实数值,或者即使它分别返回分子和分母,它也有效。
感谢。
答案 0 :(得分:2)
(fp #...)
是 SMT FloatingPoint理论定义的值/数字。它是精确的并且避免了舍入和/或截断的实数表达式带来的任何问题。例如。将此值转换为double
将需要至少一次舍入,并将具有大指数的浮点数转换为十进制实数表示可能是巨大的。
您可以使用Z3_fpa_get_numeral_*
函数将单独的符号,有效数和指数值提取为位向量,字符串或int64,但应由应用程序组合和/或近似它们。
此外,还有一个名为pp.fp_real_literals
的参数,用于启用模型值的实数/十进制编号表示,Z3_get_numeral_string
应该遵守这些表示。这些也分为有效数和指数,但它们可以简化调试。