一般我们在构建 CNN 的时候都是以 32 位浮点数为主,这样在网络规模很大的情况下就会占用非常大的内存资源。然后我们这里来理解一下浮点数的构成,一个 float32 类型的浮点数由一个符号位,8 个指数位(表示小数点后的有效位数)以及 23 个尾数为构成,即:
1个符号位[ ] + 8个指数位[ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] + 23个尾数[ ]
十进制数字v可以通过下面的公式算出:
v
=
(
−
1
)
s
M
2
E
其
中
E
=
e
x
p
−
B
i
a
s
s
.
t
.
B
i
a
s
=
127
v=(-1)^sM2^E \\ 其中E=exp-Bias\\ s.t. Bias = 127
v=(−1)sM2E其中E=exp−Biass.t.Bias=127
其中s为符号位,M=1.x,其中x为尾数部分数据,exp为指数部分,可以看出E的范围为[-128, 127]之间.所以v的范围最大属于2^127, 约为1e37范围.
对于frac,我们有
1
0
6
<
2
23
<
1
0
8
10^6 <2^{23}<10^8
106<223<108, 即,小数点后有效位数十进制下有6位有效数字.
参考资料:https://www.zhihu.com/question/67299995