文章目录
-
- 简述
- 浮点数的解释
- 浮点数的存储过程
- 浮点数的转换过程
- 浮点数的存储过程
- 浮点数注意事项
简述
大部分人会认为浮点数与整数的存储没有区别,就是按字节排序存储。事实与人们认为的不同,超乎我们的认知,不禁感叹前人的智慧,接下来我们就来一同揭开这"浮点数存储"的“面纱”....
浮点数的解释
浮点数:指小数点位置可浮动的数据
(1) 单精度浮点数(32位),阶码8位,尾数24位(内含1位符号位)。
(2) 双精度浮点数(64位),阶码11位,尾数53位(内含1位符号位)。
浮点数的存储过程
浮点数大致可以用一个公式写出:N=(-1)^S*M*2^E
1.N是浮点数
2.(−1)^S 表⽰符号位,当S=0,V为正数;当S=1,V为负数
3.M 表⽰有效数字,M是⼤于等于1,⼩于2的
4.2 E 表⽰指数位
浮点数存储分为float浮点数存储和double浮点数存储:
1.float浮点数存储类型:S为一个字节,E为8个比特位,M为23个比特位。例图如下:
2.double浮点数存储类型:S为一个字节,E为11个比特位,M为52个比特位。例图如下:
浮点数存储过程中的特别规定:
1.IEEE 754 对有效数字M和指数E,还有⼀些特别规定。1<M<2,所以M为1.xxxxxx,xxxxxx为小数部分。
每次在存储的过程中都会存储这个1,因此在存储过程中只会存储小数部分,省略了1。等到读取数据的时候再在第一位加上1,这样子可以节省1个位置,给浮点数存储更精确。
2.E的存储
E为一个无符号整数,如果E为8位,存储的数据为0~255,如果E为11位,它的取值范围为0~2047。IEEE 754规定,存⼊内存时E的真实值必须再加上 ⼀个中间数,对于8位的E,这个中间数是127;对于11位的E,这个中间数是1023。
浮点数转换过程
我们以9.0为例:
9.0转换为二进制:1001.0 转换为科学计数法:1.001×2^3
所以: 9.0 = (−1) ∗ 0 (1.001) ∗ 23 ,那么,第⼀位的符号位S=0,有效数字M等于001后⾯再加20个0,凑满23位,指数E等于3+127=130, 即10000010
所以,写成⼆进制形式,应该是S+E+M,即:0 100000010 001 0000 0000 0000 0000 0000 0000,这个32位的⼆进制数,被当做整数来解析的时候,就是整数在内存中的补码,原码正是 1091567616 。
浮点数读取过程
指数E的取出分为三个情况:
1.E不全为1或者不全为0:
这时,浮点数就采⽤下⾯的规则表⽰,即指数E的计算值减去127(或1023),得到真实值,再将有效 数字M前加上第⼀位的1。
2.E为全0:
这时,浮点数的指数E等于1-127(或者1-1023)即为真实值,有效数字M不再加上第⼀位的1,⽽是还 原为0.xxxxxx的⼩数。这样做是为了表⽰±0,以及接近于0的很⼩的数字。
3.E为全1:
这时,如果有效数字M全为0,表⽰±⽆穷⼤(正负取决于符号位s)。
浮点数注意事项
1.因为浮点数的存储位数是有限的,所以浮点数存储的精度也是有限的,无法做到高精度。
2.浮点数不能存储特殊数字,例如3.14、0.445等,这些数字难以转换为二进制,转换之后的存储位数很多,无法精确存储和读出。
以上是本人的个人心得,如有错误的地方,请大佬多多指教!!!