我有两个关于编写IEEE浮点常数的问题,正如Z3的FPA逻辑所接受的那样:
首先,在this question中,Christoph使用了这个例子:
((_ asFloat 11 53) roundTowardZero 0.5 0))
我想知道最后0
表示什么?我试过了:
((_ asFloat 11 53) roundTowardZero 0.5))
这似乎也有效。 Rummer的paper似乎也不需要最后的0;所以我很好奇它扮演的角色。
其次,当我从Z3获得一个模型时,它会打印浮点文字,如下所示:
(as +1.0000000000000002220446049250313080847263336181640625p1 (_ FP 11 53))
如何解释p1
后缀?还有哪些其他后缀?
谢谢..
答案 0 :(得分:3)
感谢你指出这些问题。它们都是因为输入或输出中的浮点文字没有达成一致的标准。
示例中的最后0
表示(二进制)指数,即(... 0.5 1) == 1.0
。我们之所以添加这个,只是因为如果无法单独指定数字,数字有时会占用大量空间。这样,我们通常可以非常简洁地指定它们。
输出中的p1
后缀表示二进制指数,即e8
表示10^8
,后缀p8
表示2^8
。 Z3目前只使用二进制指数,因此这里总会有一个p后缀,但这可能在将来发生变化。数字的其余部分给出足够的十进制数字来表示精确的结果。
请注意,SMT社区尚未就输出格式达成一致。这可能在将来发生变化。例如,有人讨论是应该用IEEE位矢量格式还是在实数和非IEEE位向量之间的中间格式。