定点量化和无损量化

硬件电路里面数据位宽都是一定的。在处理数据流是,数据的位宽也是一定的。所以浮点数需要先转变成定点数进行运算。

举例说明。12.918,定点量化时对整数部分和小数部分分别量化。

(1)整数部分12,最少使用4位量化,4-bit表示范围0~15;

(2)小数部分0.918,假设12.918整体使用12位量化,整数已使用4-bit,则小数部分还能使用8-bit量化,能够表示2的8次方共计256个刻度,每个刻度的间隔是1/256 = 0.00390625,这个值也就是量化精度。

小数0.918需要多少个刻度来表示呢? 0.918/(1/256) = 0.918*256 = 235.008,四舍五入取整,则使用235个刻度来表示,误差是0.008个刻度,误差大小是0.008*(1/256) = 0.00003125。

量化误差小于量化精度的一半,认为是“无损量化”。由于量化后误差0.00003125肯定是小于精度0.00390625的一半,所以这个误差小到可以认为是无损量化。

当使用11位量化时,同理:

(1)整数部分12,最少仍需要4位量化,4-bit表示范围0~15;

(2)小数0.918,只能使用剩下的7-bit量化,能够表示2的7次方共计128个刻度,每个刻度的间隔是1/128。

小数0.918需要多少个刻度来表示呢? 0.918/(1/128) = 0.918*128 = 117.504,四舍五入取整,则使用118个刻度来表示,误差是-0.496个刻度,误差大小是-0.496*(1/128) = -0.003875,保留四位小数并取正数,0.0039。

### 12.918 的无损定点化方法 对于数值 `12.918` 进行无损定点化处理,可以遵循如下原则: #### 确定整数与小数的位宽 假设选择符号位为 1 位,整数部分为 4 位,小数部分为 12 位,则总共占用 17 位。这种配置能够确保足够的精度来表示给定的小数值。 #### 计算最大值最小值 在这种情况下,最大正数将是 \( (2^{(4-1)} - 1) + \frac{2^{12} - 1}{2^{12}} = 7 + (\text{几乎等于 } 1)\),即大约为 8;而最小负数则会是 `-8`[^1]。 #### 转换浮点数至定点数 为了实现无损转换,需要找到最接近原始浮点值得定点数表达形式而不引入舍入误差。具体操作如下所示: ```python def float_to_fixed_point(value, int_bits=4, frac_bits=12): scale_factor = 2 ** frac_bits fixed_value = round(value * scale_factor) # Ensure the value fits within the specified bit width max_val = ((1 << (int_bits - 1)) - 1) + ((1 << frac_bits) - 1)/(1 << frac_bits) min_val = -(1 << (int_bits - 1)) if not(min_val <= value <= max_val): raise ValueError(f"value {value} out of range [{min_val}, {max_val}]") return fixed_value fixed_12_918 = float_to_fixed_point(12.918) print(f"The fixed-point representation of 12.918 is: {fixed_12_918}") ``` 上述代码定义了一个函数 `float_to_fixed_point()` 来完成从浮点到固定点的转换,并打印出了 `12.918` 对应的定点数表示结果。注意这里采用了四舍五入的方式(`round`)以尽可能减少量化噪声的影响。 通过这种方式,可以在不损失精度的情况下将浮点数 `12.918` 表达成适合硬件计算的形式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值