定点数无损量化

定点数无损量化

量化公式

若需要量化成的定点数格式:m位定点数,n个小数位,无符号位,那么n称作量化系数,则将一个浮点数量化成该格式的定点数公式为
n u m f i x = f l o o r ( n u m f l o a t 2 n ) num_{fix}=floor(num_{float}*2^n)
floor为向下取整函数(舍弃小数位),该格式的定点数最小能够表示的数为1/2^n , num_fix为量化之后的m位定点数,表示的数为 n u m f i x 1 / 2 n num_{fix}*1/2^n
引用其他博客的话,可以这样理解:量化系数n决定了我们逻辑上认为01序列中可表示的单位值为1/2^n ,而CPU读取的数字表示有多少份单位值
举例来说,对于固定的01序列值:0001_1100

量化系数 CPU读取值 单位值 表示逻辑值
3 28 0.125 3.5
2 28 0.250 7.0

所以,定点数的小数点实际中是没有的,这只是我们逻辑上的一种设定。01序列是一样的,CPU读取都是相同的,因为我们逻辑上小数点的不同位置,我们认为它代表的值是不同的

例题

一道很经典的题:对12.918做无损定点化,最小位宽是多少?(大疆笔试题)
思路:首先整数部分很明显至少需要4位,而找小数部分最少位宽的最方便方法是,根据上面的量化公式,将小数部分不断乘以2,直到乘出的结果为只含有整数为止,那么此时进行定点量化就是完全无损的。但是对于这道题0.918,无论乘以2的多少次方都无法得到只含整数的结果,那么是否就意味着无法无损量化了呢?其实,无论有多少小数位,2进制编码的精度都是以5结尾的,因此2进制编码并不能完全无损的表示任意小数,但是根据数学上误差的概念,只要误差小于最小精度的一半,就可以认为是“无损”的了(本质上就是4舍5入)。那么如果小数位用8位表示,乘以2的8次方取整,舍弃的值为0.008,除回2的8次方,得到量化误差为0.0003125,而精度为1/(2^8)=0.00380625, 量化误差小于精度的一半,满足“无损条件”。而如果小数位用7位表示,经过同样的方法可以证明无法无损量化。

猜你喜欢

转载自blog.csdn.net/qq_31006535/article/details/106064595