1、浮点数的表示方法
国际标志IEEE(电器和电子工程协会)754标准:任意一个二进制浮点数V可以表示为
(-1)^S * M * 2^E(科学计数法)
- (-1)^S表示符号位。当S=0时,V为正数;当S=1时,V为负数
- M表示有效数字,1<=M<2
- 2^E表示指数位
例如:十进制5.0
-> 101.0
-> 1.01*2^2
-> (-1)*0 * 1.01*2^2
-> S=0, M=1.01, E=2
2、浮点数的不精确存储
二进制的数据小数点后各位的权重是2^-1, 2^-2, 2^-3, ...
因此,在十进制下有穷位的小数,在二进制下不一定是有穷位的;在十进制下能精确表示的小数,在二进制下也不一定能精确表示
例如:V=9.6f
->1001.100000......
3.存储方式
国际标志IEEE(电器和电子工程协会)754标准:
1.二进制表示
对于32位(4byte)的单精度浮点数
- 最高的1位是符号位S
- 接着的8位是E
- 剩下的23位为有效数字M
对于64位(8byte)的双精度浮点数
- 最高的1位是符号位S
- 接着的11位是E
- 剩下的52位为有效数字M
2.对于M:
M总是写成1.xxxxxx的形式,所以保存M时,会默认M的第一位是1,然后舍去这一位
等到读取的时候,才把第一位的1加上去
这样就能节省1位有效数字
3.对于E:
(1)存入
E是一个unsigned int
这意味着,如果E是8位,取值范围则为0~255;如果E是11位,取值范围为0~2047
但是E是可以出现负数的
所以IEE 745规定,将E存入内存前,必须先给真实值加上一个E的取值范围的中间数。对于8位的E,这个中间数是127;对于11位的E,这个中间数就是1023
(2)取出
- E全为0:E=1-127 or 1-1023,M不再给上第一位的1,而是还原为0.xxxxx的小数,这样做是为了表示+-0,以及接近于0的很小的数字
- E全为1:如果M=0,表示+-无穷大
- E不全为0或不全为1:分割,读取S,E,M,还原E,M