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
应该遵守该参数。这些也分为有效数和指数,但它们可以简化调试。
我在 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
应该遵守该参数。这些也分为有效数和指数,但它们可以简化调试。