gcc 理解愚者/Clang中的定点表示法

cuxqih21  于 2022-12-13  发布在  其他
关注(0)|答案(1)|浏览(153)

我正在努力理解定点符号是如何工作的,我已经阅读了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;

我应该如何看待这些除法运算符?它们是小数点所在的位置吗?如果是的话,有没有一种方法可以以某种方式直观地验证二进制表示(通过打印出值)?

6ie5vjzr

6ie5vjzr1#

我应该如何看待这些除法运算符?
您应该将这些划分视为单元测试,以检查该划分是否正常工作。
可能还有更多的单元测试(例如,做short _Accum sa_const2 = 0.5hr * 2.0hk;之类的事情来测试乘法是否有效,做short _Accum sa_const2 = 0.5hr + 2.0hk;来检查加法是否有效,等等)。
它们在小数点的位置吗?
不可以。小数点由变量的类型决定。例如,short _Accum被描述为(至少-参见注解)“s4.7”,这意味着它有1个符号位、4个整数位和7个小数位;且short _Accum myValue = 3.5hr将等效于short myValue = (3.5) * (1 << 7);

  • 注意:就像C最初得到的普通变量类型是错误的/依赖于实现的(例如,没有人能确定int是否是16位或更大,并且在大型计算机上编写/测试的可移植软件由于在小型计算机上的bug而崩溃),这是一个问题,他们后来通过引入更好的类型(例如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”)。
是否有一种方法可以直观地验证二进制表示(例如,通过打印出值)?
我猜你可以把它转换成一个原始的无符号整数类型并打印出来。

相关问题