一直以来,程序中接触的数据类型都是int整型,char字符型,float单精度浮点型,double双精度浮点型。看到浮点和定点一直不知道如何划分这个概念的范畴。以为浮点就是float表示小数,定点就是int可表示整数而已。经过学习明白了显然是错误的。应该是这样划分的:
浮点:小数点非固定的数,可表示数据范围较广,整数,小数都可表示。包含float,double;
定点:小数点固定,可表示整数,小数。int本质是小数点位于末尾的32位定点数而已;
有了这个认识,后面的讨论就可以开始了。
3. 定点数的表示法
对于计算机来说,浮点定点的概念是看不见的,因为它只能看到:0…00001110,至于它表示多少,是逻辑层面的设置。你如果让它是int那就按照int表示法对每个位赋予意义,如果你让它是float就按照float表示法赋予意义。
对于00011100 表示的定点数:
如果我们设定小数点是位于最后一位的,即00011100. 则其表示28若设定小数点位于后三位的,即00011.100 则其表示3.50若设定小数点位于后四位的,即0001.1100 则其表示1.75
可以看到:
小数位数越多,表示的精度越高。若小数点后有n位,则其表示的最大精度为1/(2^n)(这里相当于将二进制切换到十进制来看精度。);整数位数越多,可表示的最大值越大。
以8位为例,最高位为符号位:
若整数位占4位,小数位占3位,则其最大精度为0.125,最大值为15.875若整数位占5位,小数位占2位,则其最大精度为0.250,最大值为31.750若整数位占6位,小数位占1位,则其最大精度为0.500,最大值为63.500若整数位占7位,小数位占0位,则其最大精度为1.000,最大值为127
4. 浮点数 & 定点数
4.1 为何要把浮点数转换为定点数呢?
这来源于项目中神经网络的需求,网络中大量的参数,如果全部用F32表示,一是占用空间大,二是读取效率不高。
如果我们可以将某些浮点数转换为定点数表示,在接受精度损失的前提下,每次就可以读取多个进行运行,可显著提高运算效率。
举例来说,我们用8位定点数,1个符号位,4个整数位,3个小数位,则其可表示范围是-16.00~15.875,最大精度0.125。