浮点数通常可以用来表示任意一个实数。
具体表示格式,如下:
浮点数 = 尾数 * 基数阶码
N = M * r E(其中尾数是一个规格化的纯小数)
看到这个表达方式大家应该很熟悉,仔细看一下这不就是科学计数法吗?科学计数法基数是10,这个表示基数是 2而已。
举个例子:
二进制表示成类似科学计数法的浮点数:11100.101 = 1.1100101 * 24
十进制表示成科学计数法格式:28.625 = 2.8625 * 101
电脑当然不能直接存了,在电脑中的存放格式为:
数符 | 阶符 | 阶码 | 尾数 |
---|
或
阶符 | 阶码 | 数符 | 尾数 |
---|
其中;数符为 尾数的符号,阶符为 阶码的符号。
IEEE 754
在IEEE 754 标准中:
规格化数:+/- 1.xxxxxxxx2 * 2E(其中指数位用移码表示,有效位用原码表示)
规格化尾数总是将最高位规格化为1,无需记录在存储格式中,隐含表示
单精度浮点数计算公式:(-1)S * (1 + 有效位) * 2(阶码-127)
双精度浮点数计算公式:(-1)S * (1 + 有效位) * 2(阶码-1023)
单精度存储格式:
符号位 | 阶码 | 有效位 |
---|---|---|
1 bit | 8 bit | 23 bit |
共占32 bit位;
移码的偏置值为127;
规格化阶码范围为:0000 0001(1)~1111 1110(254),全0和全1用来表示特殊值!
阶码 | 有效位 | 表示位 |
---|---|---|
0 | 0 | +/- 0 |
0 | 非零 | 无效值 |
1-254 | 有效值 | 有效值 |
255 | 0 | +/- 无穷 |
255 | 为零 | 非数 |
双精度存储格式:
符号位 | 阶码 | 有效位 |
---|---|---|
1 bit | 11 bit | 52 bit |
共占64 bit位,移码的偏置值为1023
举个例子:
将 -12.75 转换为二进制表示:
不用管符号位,因为 IEEE 754 是将符号专门存储起来的
第一步将整数部分 12=1100B
第二步将小数部分 .75=.11B
第三步将数规格化 1100.11=1.10011 * 23
注意这里的3是 x - 127 = 3
所以 x = 130 = 127+3=128 + 2 =1000 0010B
最终存储为:
1 | 1000 0010 | 100 1100 0000 0000 0000 0000 |
---|
用十六进制表示为: C14C0000H