浮点代码转定点加速中定点化原理分析
update:2022年2月10日
基本概念
在分析讲解定点和浮点之间映射前,我们需要了解以下基本概念。
位宽
- 一个浮点数用多少位的整数来表示
- 如(16, 4),则表示用16位整数来表达浮点数
- 假设为有符号数
- 则其中:1位为符号位,4位数为表达整数,剩余11位表达(0, 1)的小数
分布如图:
标值
-
即指用多少位,来保存小数
-
若位宽表示为(16, 4),则标值为Q15
浮点数与定点数映射转换
浮点到定点
一句话表达:浮点数乘以2^Q,然后圆整或截断成整数,即得定点数。其中Q为定标值。
总体过程如下图:
由于定点到浮点是浮点转换的逆过程,所以核心只要掌握浮点到定点的映射即可。
主要思路:
-
查看对应变量的浮点值范围
-
取绝对值后,找到最大值,并截断取整为
maxNum
-
分析需要多少位来存
maxNum
,剩余的位数则一个留给符号位,其余位留给小数位 -
如用32位定点存浮点数,用25位来存整数,留1位符号位,剩6位给小数,故位宽表示(32, 25),标值为Q6
-
定点值 fix = float * 2^6,将整数左移6位,低6位则是小数转换而来
-
定点能表示的浮点数精度为:1/2^6=0.015625,用最小的定点数1,来转化成最小浮点数,得到精度值
定点到浮点
一句话表达:二进制转化为十进制整数,定点整数除以2^Q,做浮点运算,结果即为对应浮点数。
总体过程如下图:
主要步骤:
- 知道标值Q,则定点是浮点转换的逆过程
- 公式为 float = fix / 2^6
- 整数部分,fix右移6位后得到的结果
- 小数部分,就是用定点除法运算fix/2^6的余数mod,mod / 2^6做浮点运算所得结果
定点数与浮点数存储的区别
联系之前文章《计算机中浮点数存储的本质》,下面将定点数与之对比:
- 总述:核心原理类似,具体实现不同
- 核心相同处
- 都是将整数移至高位,剩余位给小数位
- IEEE算法里科学计数法前面的步骤跟定点数相同
- 如:19.625,用32bit浮点存
- IEEE科学计数法前的结果:10011.101,假设用8位存整数,1位存符号位,剩余23位存小数
- 用Q23的定点表达:00010011.10100000000000000000000
- 具体不同处
- 定点数的标是可变的,32位浮点数IEEE算法固定只用8位来存指数部分,1位来存符号位,剩余位数存尾数
- 浮点数存储算法更复杂,定点数步骤仅相当于只到IEEE算法科学计数法前面
- IEEE算法中,后面继续采用科学计数法将整数再次压缩成指数来存储,从而提高了精度
- 为什么能提高精度?
- 用更少位数来存整数,更多位数来存小数,以提高精度
- 为什么能提高精度?
- 注意:在科学计数法后,8位的指数是整数相关信息,但剩余位数存的尾数,不全是小数,也有整数移位后的信息