0.xyz类Q格式定点数乘法整数位增长特性技术问询
你观察到的现象是Q格式定点数运算在特定取值范围内的正常预期行为,只要满足输入取值约束,你提出的位宽优化方案完全可行,仅存在一个需要注意的边界场景。
首先对齐约定的Q1.X格式定义:1位带符号整数位(即符号位,权重为-2^0)、X位小数位,可表示的数值范围是 [-1, 1-2^(-X)],所有你描述的0.xyz形式的输入,本质都是绝对值严格小于1的小数。
根据代数基本规则,两个绝对值严格小于1的实数相乘,乘积的绝对值一定严格小于1,对应到补码定点表示:
- 两数同号时乘积为正,落在
[0, 1)区间,二进制表示的整数位恒为0,双字长乘积中高位的连续0均为符号扩展位,无有效数值信息; - 两数异号时乘积为负,落在
(-1, 0]区间,二进制补码表示的整数位恒为1,双字长乘积中高位的连续1均为符号扩展位,无有效数值信息。
你贴出的4组测试结果完全符合这个规律:正乘积的高位整数段为00、负乘积的高位整数段为11,都是双精度乘法结果的符号扩展,没有出现有效整数位。
这个特性成立的唯一例外场景是:两个乘数均取Q1.X格式可表示的最小值-1(编码为1后接X个0)。
此时乘积为(-1)*(-1) = 1,对应双字长Q2.2X格式的编码为01后接2X个0,高位整数段出现了有效数值1,如果仅保留1位符号位+2X位小数位,会直接截断这个有效整数位,得到错误的0值结果。
除了这个场景之外,Q1.X格式下所有其他取值的乘法都不会产生绝对值≥1的结果,不存在整数位溢出风险。
如果你的应用场景可以保证输入不会出现-1的编码(例如输入是归一化的传感器采样值、系数范围经过裁剪排除了-1),你提出的位宽方案完全成立:乘法结果仅需保留1位符号位+2*X位小数位,不需要额外分配整数位,不会出现溢出,这个优化在FPGA、定点DSP等资源敏感的场景下非常常用。
如果无法保证输入不会出现-1,只需要加简单的边界处理即可:检测到输入为-1编码时,将其饱和为-(1-2^(-X))(即编码为1后接X个1),即可规避唯一的溢出风险。
注意:以上结论仅针对单次乘法运算。如果后续需要对多个乘积做累加,累加器必须根据累加次数预留足够的整数位,避免累加结果溢出。
内容的提问来源于stack exchange,提问作者Fra93

