3 / 20 · 概念
定点输出策略
区分输入缩放、负数舍入、饱和与回绕。
课时内容可免费阅读,选课后可保存学习进度。
数据位存储整数,比例因子赋予含义
用整数 X 和 F 个小数位表示 x,即 x=X/2^F。A 和 B 使用相同的 F。它们的乘积与累加器具有 2F 个小数位。将最终原始和 S 转回输入比例,需要除以 2^F。应在完整归约之后只转换一次;如果先对每项舍入,就可能丢弃合在一起才有意义的贡献。
F=4 时,[1.5,−0.5] 存储为 [24,−8],[0.25,2.0] 存储为 [4,32]。原始点积为 24×4−8×32=−160。其真实值为 −160/256=−0.625,在 F=4 下的输出整数为 −10。
明确测试负数舍入
S=−17、F=4 时,精确的输出整数为 −1.0625。算术右移得到 −2;向零截断得到 −1。舍入到最近值、恰好半值时取偶数,也得到 −1。因此,算术移位不能与所有“丢弃小数部分”的解释互换。在半值 −24/16=−1.5 和 −40/16=−2.5 处,取偶数舍入都选择 −2。
默认转换方式为:对完整和舍入到最近值,半值取偶数,然后按输出位宽饱和。对绝对值计算商 q 和余数 r。当 r 大于除数的一半,或恰好等于一半且 q 为奇数时,将 q 加一。之后恢复原符号。在 RTL 中,对最小负数取绝对值需要更宽的临时值;Node 参考使用 BigInt。
定义输出溢出
八位有符号输出范围为 −128..127。舍入值 130 饱和为 127,或回绕为 −126。数值 −130 饱和为 −128,或回绕为 126。两种策略都可以是有意选择,但必须明确命名并测试。
分别比较原始累加器和转换后的输出。原始和错误通常指向算术或调度;和正确而输出错误,则指向比例、舍入或饱和。保留手算的边界用例,避免参考模型和 RTL 同时掩盖相同的转换错误。
自己试试
求 F=4、S=−56 时半值取偶数的舍入结果,以及 F=4、S=−2080 时饱和后的八位输出。
阅读解释
−56/16=−3.5 舍入为偶数 −4。−2080/16=−130,舍入后饱和为 −128。