转换不同宽度的浮点数

时间:2014-04-07 04:45:31

标签: z3

我想通过给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版本)。

1 个答案:

答案 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))