c++ - Z3 SMT Solver - 如何在 FPA 中提取 float 的值?

标签 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 (...) 这样的内置函数返回实数,或者即使它分别返回分子和分母,也可以工作。

谢谢。

最佳答案

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

您可以使用 Z3_fpa_get_numeral_* 函数将单独的符号、有效数和指数值提取为位 vector 、字符串或 int64,但这取决于应用程序来组合和/或近似他们。

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

关于c++ - Z3 SMT Solver - 如何在 FPA 中提取 float 的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48930084/

相关文章:

c++ - 使用可变参数模板改变模板参数

c++ - 返回 QFile::copy from web

c++ - IEEE 浮点和内存中的快速浮点表示

c++ - 字符串类型函数,模板特化使调用统一

c++ - 如何验证删除的指针?

google-sheets - Google 表格小于或等于 (<=) 提供错误结果

SwiftUI 字符串格式将我的值四舍五入到最接近的整数?

z3 - 我们需要添加哪些额外的公理,以便 Z3 可以验证递归程序的可满足性?

z3 - ( :var 0) in z3 Quantifier's body

graph-theory - 3-sat 和 Tutte 多项式