在神经网络当中,为了尽快落地就需要考虑到数据存储以及速度问题,这时候将浮点数转为定点数就是一种比较常规的做法,也就是涉及到Binary neural networks和quantization,这部分有待下一篇继续补充,现在就要搞定浮点与定点的计算机表示及互转。看了挺多网上内容,智商有限没有完全明白,不过最后还是找到了两篇写得比较清晰的,特此结合起来解决当前问题。篇章1
C语言和C#语言中,对于浮点类型的数据采用单精度类型(float)和双精度类型(double)来存储,float数据占用32bit,double数据占用64bit,我们在声明一个变量float f= 2.25f的时候,是如何分配内存的呢?如果胡乱分配,那世界岂不是乱套了么,其实不论是float还是double在存储方式上都是遵从IEEE的规范的,float遵从的是IEEE R32.24 ,而double 遵从的是R64.53。
无论是单精度还是双精度在存储中都分为三个部分:
符号位(Sign) : 0代表正,1代表为负指数位(Exponent):用于存储科学计数法中的指数数据,并且采用移位存储尾数部分(Mantissa):尾数部分
其中float的存储方式如下图所示:
而双精度的存储方式为:
R32.24和R64.53的存储方式都是用科学计数法来存储数据的,比如8.25用十进制的科学计数法表示就为:8.25*
;而120.5可以表示为:1.205*
,这些小学的知识就不用多说了吧。
而我们傻蛋计算机根本不认识十进制的数据,他只认识0,1,所以在计算机存储中,首先要将上面的数更改为二进制的科学计数法表示,8.25用二进制表示可表示为1000.01。
在此插播二进制小数与十进制进行互换的做法:
1、十进制转为二进制:十进制0.125转二进制为0.001。就是将小数部分不断乘以2,每次取整数部分,直到为1。
2、二进制转为十进制:二进制0.001转为十进制为0.125。将各个位乘以2的负次方,最后将得到的结果相加,0*1/2+0*1/4+1*1/8得十进制的0.125
120.5用二进制表示为:1110110.1用二进制的科学计数法表示1000.01可以表示为1.0001*
,1110110.1可以表示为1.1101101