"该类量化过程不引入缩放操作,仅通过截断尾数位与指数位实现精度压缩,同时保留浮点结构。因此其数值误差主要来源于舍入,而非量化映射误差。"
这容易引起歧义,可能会被错误理解为,如,指数为 (01111011), 我截取前5位(这甚至没有做Unbiasing),或者Unbiasing后截断前5或后5。
实际上:
尾数位的降精度确实表现为物理上的位截断(Truncation)或舍入(Rounding);
但指数位的降精度本质上需要进行重新偏置(Re-biasing):
以 8bits $\rightarrow$ 5bits 为例子
第一步:解偏置(Unbiasing),获取真实指数系统首先需要从源数据类型中提取真实物理量级。
$$E_{real} = E_{FP32_stored} - 127$$
第二步:重新偏置(Re-biasing),映射至目标精度计算在低精度格式下,该量级应该对应的存储值。
$$E_{FP16_target} = E_{real} + 15$$
第三步:动态范围校验与极值处理(这是所谓“截断”的真实动作)
由于 FP16 的指数空间远小于 FP32,必须对 $E_{FP16_target}$ 进
行范围判定。这并非位截断,而是边界饱和处理(Saturation):
- 上溢(Overflow)处理:若 $E_{real} > 15$,即数值超出了 FP16 所能表达的上限( $\sim 65504$ ),硬件通常会将其强制赋值为该数据类型允许的最大值,或直接标记为无穷大(Inf)。
- 下溢(Underflow)处理:若 $E_{real} < -14$ ,即数值过于接近绝对零,跌穿了 FP16 的常规表示范围,系统会触发非规格化(Subnormal / Denormal)处理逻辑,或直接冲刷为零(Flush-to-Zero, FTZ)。
误差来源的差异:尾数位的压缩带来的是舍入误差(Rounding Error);而指数位的位宽减少(动态范围变窄)带来的是饱和/溢出误差(Overflow/Underflow),当数值超出表示范围时,会被强制置为 Inf 或 0。
"该类量化过程不引入缩放操作,仅通过截断尾数位与指数位实现精度压缩,同时保留浮点结构。因此其数值误差主要来源于舍入,而非量化映射误差。"
这容易引起歧义,可能会被错误理解为,如,指数为 (01111011), 我截取前5位(这甚至没有做Unbiasing),或者Unbiasing后截断前5或后5。
实际上:
尾数位的降精度确实表现为物理上的位截断(Truncation)或舍入(Rounding);
$\rightarrow$ 5bits 为例子
但指数位的降精度本质上需要进行重新偏置(Re-biasing):
以 8bits
第一步:解偏置(Unbiasing),获取真实指数系统首先需要从源数据类型中提取真实物理量级。
第二步:重新偏置(Re-biasing),映射至目标精度计算在低精度格式下,该量级应该对应的存储值。
第三步:动态范围校验与极值处理(这是所谓“截断”的真实动作)
由于 FP16 的指数空间远小于 FP32,必须对$E_{FP16_target}$ 进
行范围判定。这并非位截断,而是边界饱和处理(Saturation):
误差来源的差异:尾数位的压缩带来的是舍入误差(Rounding Error);而指数位的位宽减少(动态范围变窄)带来的是饱和/溢出误差(Overflow/Underflow),当数值超出表示范围时,会被强制置为 Inf 或 0。