我第一次使用Z3-4.6.0 C ++。抱歉没有问题。
我的问题有2个部分。
如果我有一个浮点数,我使用 Z3_mk_fpa_to_ubv(...)函数创建一个无符号位向量。
我知道我可以使用 Z3_mk_fpa_to_ieee_bv(....)进行优雅和符合IEEE-754标准的转换。之后我可以添加,子等等位向量。
只是好奇。
非常感谢。
答案 0 :(得分:4)
我担心你会错误地解释这些功能的作用。使用SMTLib浮点数时保持打开的一个很好的参考是:http://smtlib.cs.uiowa.edu/papers/BTRW15.pdf
此功能对应于引用文章中的FPToUInt
功能。它的定义如下:
(上面的NaN选择具有误导性:它应该被解读为“未定义。”)
请注意,这里的精度损失可能很大,具体取决于FP值是什么以及矢量的位宽。想象一下,将双精度浮点值转换为8位字:您将在±2.23×10 ^ -308到±1.80×10 ^ 308范围内的值粉碎到仅256个不同的值。这意味着大量的转换只会经历大规模的舍入取消。
您应该将其视为C语言中的“强制转换”:
unsigned char c;
double f;
c = (char) f;
这是从双精度到无符号字节转换的本质,它将遭受严重的精度损失。在另一个方向,如果你转换为一个非常大的位向量(比如一个有千位的位向量),那么你的转换仍然会在舍入模式下失去精度,尽管你将能够覆盖所有的整数值正是在这个范围内。因此,它实际上取决于您转换为的BV类型以及您选择的舍入模式。
此功能与“保留”值无关。所以在这里问“精确损失”是无关紧要的。它的作用是根据IEEE-754规范为您提供浮点值的基础位向量表示。维基百科文章对此表示进行了很好的讨论:https://en.wikipedia.org/wiki/Double-precision_floating-point_format#IEEE_754_double-precision_binary_floating-point_format:_binary64
特别是,如果将此函数的输出解释为二进制补码整数值,则会得到一个完全不相关的值,该值与浮点数本身的值无关。 (此外,由于NaN具有多个相应的位向量模式,因此此转换不是唯一的。)
长话短说,从浮点数到位向量的转换将受到精确损失的影响,不仅因为由于四舍五入而失去“分数”部分,而且由于范围有限,除非你选择一个非常大的位 - 矢量大小。 IEEE-754表示转换不保留值,因此对通过此函数转换的值进行算术或多或少没有意义。