写代码的时候发现对Float的原理和使用方式没有一个系统的理解,找了资料学习后将知识点在这里进行整理
Float存储原理:
提到Float的存储方式首先必须提一下IEEE 754这个标准,该标准的出现主要解决了不同计算机之间浮点数表示方式和计算方式无法兼容的问题,现在的计算机内的浮点数的存储方式都是支持这个标准的。
一个浮点数主要由三部分组成:$$V = (-1)\^{s}\\times M\\times 2\^{E}$$
s表示浮点数的正负
M表示小数部分
E是2的指数,用来表示2的乘方
如果将这三部分对应到存储的bit位上去,那么s对应一个bit位,用来表示浮点数的正负,k个bit位用来表示表示2的乘方,这k个bit位统一用exp来表示,n个bit位用来表示小数部分,统一用fra来表示
现在已经知道浮点数的存储位一共有三部分组成,而浮点数本身也被分成了三种类型,三种不同类型的存储方式都有其自身的特点
1:Normalized Values
这是最普通的情况,当exp部分的bit位不全为0和不全为1的时候,在这种情况下,exp部分的值E = e-Bias,这里e是exp部分的无符号整形值,$$Bias = 2\^{k-1}-1$$
frac表示小数部分的值,如果bit位的小数的值为f,frac部分的实际值M = f +1
2:Denormalized Values
当exp部分全为0的时候,这时候的浮点数就是Denormalized Values,exp对应的值E = 1- Bias,Bias的值和上面一样的定义
frac部分的实际值M = f(和前一种有区别,至于为什么后面会讲到)
Denormalized Values一个很重要的作用就是用来表示非常接近0的值
3:Special Values
当exp全部为0,frac全部为0的时候,根据s的值分别表示正无穷和负无穷大 ...