C语言 理解GCC/Clang中的定点符号



我正试图理解定点记数法是如何工作的。我已经从https://www.open-std.org/jtc1/sc22/wg14/www/docs/n996.pdf上阅读了文档,但仍然不能完全抓住它。

下面是Clang单元测试中的一个例子:

https://github.com/llvm/llvm-project/blob/main/clang/test/Frontend/fixed_point_div_const.c

https://github.com/llvm/llvm-project/blob/main/clang/test/Frontend/fixed_point_div.c

一个小片段看起来像这样:

// Division between different fixed point types
short _Accum sa_const = 1.0hk / 2.0hk;

我应该如何看待这些除法运算符?小数点在哪里?如果是这样,是否有一种方法可以直观地验证二进制表示(即通过打印出值)?

我应该如何看待这些除法运算符?

您应该将这些除法视为单元测试,以检查除法是否有效。

可能在某个地方有更多的单元测试(例如做short _Accum sa_const2 = 0.5hr * 2.0hk;来测试乘法是否有效,short _Accum sa_const2 = 0.5hr + 2.0hk;来检查加法是否有效,等等)。

它们在小数点的位置吗?

。小数点由变量的类型决定。例如,ashort _Accum描述为(至少-见注)s4.7;这意味着它有1个符号位,4个整数位和7个小数位;而short _Accum myValue = 3.5hr则等于short myValue = (3.5) * (1 << 7);

注:就像C最初如何得到正常变量类型错误/实现依赖(例如,没有人可以确定int是16位还是更大,并且在较大的计算机上编写/测试的便携式软件由于较小的计算机上的错误而中断),这是他们"纠正"的问题。后来引入了更好的类型(例如int_least16_t);他们重复了同样的错误,使定点类型同样错误/依赖于实现。

当然,这(由变量类型决定的小数点的位置)也使得建议/草案的定点支持"可能无法用于其预期目的"。特别地;关心的人也可能关心获得最佳范围和精度的折衷;这意味着它们需要每个运算符的结果(可能)是不同的定点类型-例如"s4.7 + s4.7 = s5.6";(因为加法/减法会导致你需要多1位来避免溢出),比如"s4.7 * s4.7 = s8.3";(s4.7 + s4.7) * s4.7 = s5.6 * s4.7 = s9.2"(或者"s5.6 * s4.7 = s9.10";如果你想使用更多的位来保持精度)

是否有一种方法可以直观地验证二进制表示(即通过打印出值)?

我猜你可以把它转换成一个原始的无符号整数类型,然后打印出来。

最新更新