floating-point - FMA : proof performance

标签 floating-point z3

我正在试验新的 FP 逻辑。唉,即使是与 FMA 相关的最简单的查询似乎也会给 z3 带来不少麻烦。

下面是一个这样的例子,我试图证明 x*y+0 等于 fma(x,y,0)。它做了一些额外的事情来确保 xy 不是 NaN 等,所以相等性确实成立。这个基准测试给 z3 带来这么多麻烦是有原因的吗?

我的 z3 版本:Z3 [版本 4.3.2 - 64 位 - 构建哈希码 728835357594]。

(set-option :produce-models true)
(set-logic QF_FPA)
(define-fun s3 () (_ FP  8 24) (as plusInfinity (_ FP 8 24)))
(define-fun s5 () (_ FP  8 24) (as minusInfinity (_ FP 8 24)))
(define-fun s17 () (_ FP  8 24) ((_ asFloat 8 24) roundNearestTiesToEven (/ 0 1)))
(declare-fun s0 () (_ FP  8 24))
(declare-fun s1 () (_ FP  8 24))
(assert
   (let ((s2 (== s0 s0)))
   (let ((s4 (< s0 s3)))
   (let ((s6 (> s0 s5)))
   (let ((s7 (and s4 s6)))
   (let ((s8 (and s2 s7)))
   (let ((s9 (== s1 s1)))
   (let ((s10 (< s1 s3)))
   (let ((s11 (> s1 s5)))
   (let ((s12 (and s10 s11)))
   (let ((s13 (and s9 s12)))
   (let ((s14 (and s8 s13)))
   (let ((s15 (not s14)))
   (let ((s16 (* roundNearestTiesToEven s0 s1)))
   (let ((s18 (+ roundNearestTiesToEven s16 s17)))
   (let ((s19 (fusedMA roundNearestTiesToEven s0 s1 s17)))
   (let ((s20 (== s18 s19)))
   (let ((s21 (or s15 s20)))
   (not s21)))))))))))))))))))
(check-sat)

最佳答案

Z3 通过将浮点公式转换为位向量公式(然后是 SAT)来求解浮点公式。有些方法在某些公式上比这更快(例如,基于 ACDCL 或某些形式的近似细化),但在这个特定的公式上,我希望它们都表现出较差的性能。乘法(和类似的)约束对于底层引擎来说通常很难,证明乘法保留某些属性更难。

关于floating-point - FMA : proof performance,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25098817/

相关文章:

ruby - ruby 表达式 "%.1f"是什么?它如何舍入小数?

c++ - 如何在 C++ 中处理非常小的数字?

Z3:找到所有满意的模型

python - Z3 可以用来预处理问题吗?

java - Z3 Java API : when to dispose expressions/Z3 objects?

c - 是否可以仅使用 C 中的 int 类型将 3.005 添加到 4.70?

c - 多线程合并排序在大型数据集上使用时会错过对某些元素的排序吗?

python - 我们如何计算 Z3 sat 求解器的运行时间

c++ - 在多核服务器中使用 Z3

c - 0 大于 0 的浮点值