我想通过给z3一个断言来比较两个不同宽度的浮点数。 例如,我想比较IEEE 32位和IEEE 64位浮点数。
我的尝试显示如下:
(set-logic QF_FPA)
(set-option :produce-models true)
(declare-fun x_64 () (_ FP 11 53))
(declare-fun x_32 () (_ FP 8 24))
(assert (== ((_ asFloat 11 53) roundNearestTiesToEven x_64 ) x_64))
(check-sat)
但是我收到了一条错误消息:
(错误"第5行第59栏:排序不匹配")
比较32位和64位数字的正确方法是什么?
我使用的z3版本是4.3.1(linux版本)。
答案 0 :(得分:1)
通常,这些转换非常重要,例如,当从64位向下转换为32位时,某些精度可能会丢失。这就是转换函数采用舍入模式的原因。浮点数的SMT标准确实包含以下类型的转换函数:
; from another floating point sort
((_ to_fp eb sb) RoundingMode (_ FloatingPoint m n) (_ FloatingPoint eb sb))
因此,在浮点数之间进行转换的正确方法是使用to_fp函数。 [以前,asFloat函数也可以用于此目的;在使用Z3时,我没有使用最新的不稳定版Z3出错。]一个完整的例子就是:
(set-logic QF_FPA)
(set-option :produce-models true)
(declare-fun x_64 () (_ FP 11 53))
(declare-fun x_32 () (_ FP 8 24))
(assert (== ((_ to_fp 11 53) roundNearestTiesToEven x_32) x_64))
(check-sat)
哪个Z3(最新的不稳定)接受没有错误并立即解决。或者,我们也可以考虑将x_64
转换为32位,在这种情况下,断言将如下所示:
(assert (== ((_ to_fp 8 24) roundNearestTiesToEven x_64) x_32))