我正在努力理解定点符号是如何工作的,我已经阅读了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;
我应该如何看待这些除法运算符?它们是小数点所在的位置吗?如果是的话,有没有一种方法可以以某种方式直观地验证二进制表示(通过打印出值)?
1条答案
按热度按时间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);
。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”)。
是否有一种方法可以直观地验证二进制表示(例如,通过打印出值)?
我猜你可以把它转换成一个原始的无符号整数类型并打印出来。