IEEE浮点数
浮点数编码转换采用的是IEEE规定的编码标准,float和double的转换方式相同,但是取值范围不同,编码方式有些许区别.IEEE规定的浮点数编码会将一个浮点数转换成二进制数.以科学计数法划分,将浮点数分为3个部分:符号,指数,尾数
浮点类型:float转IEEE格式
在存储方式上都是遵守IEEE浮点数的规范
Float的存储方式
Double的存储方式
举例说明:
8.25转为浮点存储
- 转二进制:8.25 <=> (二进制)1000.01
- 算指数: 找最高有效位 1000.01 = 1.0001*2的3次方 小数点左移3位 指数为3 小数点移动规则:找最高有效位 1为最高有效位
- 填表
符号位:本来是正数就填0 本来是负数就填1
指数部分:
1.第一种方式
第一位 如果上面的小数点左移就填1 右移就填0 指数为3 现在用3-1等于2 二制是10 所以1000 0010
2.第二种方式
我们知道指数为3,现在和127相加(127+3 = 130 左移就是+ 右移就是-),
转为二进 制1000 0010 这里的127不做深究
尾数部分:1.00001的小数部分填写到尾数 不够23补0
符号位(1) | 指数部分(8) | 尾数部分(23位) |
0 | 1000 0010 | 00001000000000000000000 |
0100 0001 0000 0100 0000 0000 0000 0000
IEEE浮点数:41040000
浮点数为负数
-8.25
符号位(1) | 指数部分(8) | 尾数部分(23位) |
1 | 1000 0010 | 00001000000000000000000 |
小数点右移动
1.0.25 <==> 0.01(二进制)
2.本着最高位为有效位(1)的原则 向右移动2次
0.01 = 1.0*2的-2次方 指数为-2
3.填表
符号位:0.25正数 填1
指数部分:
第一种方式:
刚是右移动小数点 最高位0 指数为-2 - 1 等于-3 -3的二进制 1111 1101 填写指
数的时候最高位已经是0 所以 0111 1101
第二种方式
127-2=125 125的二进制 0111 1101
尾数部分:1.0 尾数部分是23个0
符号位(1) | 指数部分(8) | 尾数部分(23位) |
0 | 0111 1101 | 00000000000000000000000 |
0011 1110 1000 0000 0000 0000 0000 0000
3e80 0000
IEEE浮点数转float
举例:
IEEE浮点数:41040000
41040000 转二进制 0100 0001 0000 0100 0000 0000 0000 0000
填表
符号位(1) | 指数部分(8) | 尾数部分(23位) |
0 | 10000010 | 000 0100 0000 0000 0000 0000 |
反推:
取出尾数部分
000 0100 0000 0000 0000 0000
最高有效位为1
1.000 0100 0000 0000 0000 0000
现在小数点的位置是不对的 我们还要看指数部分10000010 十进制是 130
还记得之前的127吗 130和127相差3 130大于127说明指数是+了一个数字 也就是3
也就是之前右移动了3位 最后得到
1000.01 转十进制 8.25