Z3 - 浮点算术API函数Z3_mk_fpa_to_ubv

时间:2018-02-20 21:57:49

标签: c++ floating-point z3

我第一次使用Z3-4.6.0 C ++。抱歉没有问题。

我的问题有2个部分。

如果我有一个浮点数,我使用 Z3_mk_fpa_to_ubv(...)函数创建一个无符号位向量。

  1. 失去了多少精度?
  2. 如果精度没有丢失,我可以将这个新的无符号位向量用作常规位向量并应用为其定义的所有操作,例如 Z3_mk_bvadd(....)
  3. 我知道我可以使用 Z3_mk_fpa_to_ieee_bv(....)进行优雅和符合IEEE-754标准的转换。之后我可以添加,子等等位向量。

    只是好奇。

    非常感谢。

1 个答案:

答案 0 :(得分:4)

我担心你会错误地解释这些功能的作用。使用SMTLib浮点数时保持打开的一个很好的参考是:http://smtlib.cs.uiowa.edu/papers/BTRW15.pdf

mk_fpa_to_ubv

此功能对应于引用文章中的FPToUInt功能。它的定义如下:

FPToUInt

(上面的NaN选择具有误导性:它应该被解读为“未定义。”)

请注意,这里的精度损失可能很大,具体取决于FP值是什么以及矢量的位宽。想象一下,将双精度浮点值转换为8位字:您将在±2.23×10 ^ -308到±1.80×10 ^ 308范围内的值粉碎到仅256个不同的值。这意味着大量的转换只会经历大规模的舍入取消。

您应该将其视为C语言中的“强制转换”:

unsigned char c;
double f;
c = (char) f;

这是从双精度到无符号字节转换的本质,它将遭受严重的精度损失。在另一个方向,如果你转换为一个非常大的位向量(比如一个有千位的位向量),那么你的转换仍然会在舍入模式下失去精度,尽管你将能够覆盖所有的整数值正是在这个范围内。因此,它实际上取决于您转换为的BV类型以及您选择的舍入模式。

mk_fpa_to_ieee_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表示转换保留值,因此对通过此函数转换的值进行算术或多或少没有意义。