浮点数表示
- 什么是浮点数?
定点数就是小数点位数位置固定不变,相反浮点数就是小数点的位置可以变化。
- 浮点数的表示形式
任何一个二进制数都可以表示成如下形式:
N=2^E * M
其中,E是阶码,是定点整数。M是尾码,是顶点小数。阶码的位数决定了数据的范围,阶码的大小决定小数点的位置。而尾码位数,体现了浮点数所表示的精度,位数越高精度越大。
这就相当于十进制科学计数法:10^E * M。假设我们要用科学计数法表示0.000000213。
则可以表示为2.13*10^7。 其中7就相当于阶码E,2.13就相当于尾码M。
那么在计算机中浮点数是怎么被存储的呢?
浮点数分为两个部分:阶码和尾码。在计算机中浮点数的表示格式为:
| 阶符 | 阶值 | 数符 | 尾数 |
来点实际的:0.1875的浮点数表示形式怎么写?
先转换为二进制:(0.1875)10=(0.0011)2
这里假设原码表示阶值和尾数。那么,0.1875可以表示为:
0.1875=+2^0 * +(+0.0011)=(0 0000 0 00011)
也可以表示为:+2^1+(+0.011)= (0 0001 0 0011)
考虑问题:要是尾数的位数只有4位,那么如上尾数00011,就要砍掉1位数。那么
(0 0000 0 00011)就要变成(0 0000 0 0001),表示少了一位,这就会使得精度变低。
于是就出现了浮点数的规格化处理。
浮点数的规格化处理就是让尾数最高位为1。
对于尾数00011,要使得它最高位为1,则可以写成(1 0100 0 1100)=+2^-4+11。这样使得浮点数精度提高。
IEEE754浮点数标准:
该标准提出了单精度,双精度等的数据格式规范。在此列出32位IEEE745单精度浮点数据格式规范:
| 数符s(1位) | 阶码E(8位) | 尾数M(23位) | 偏移量(127) |
在内存中的表示形式:
| 数符s(1位) | 阶码E(8位) | 尾数M(23位) |
在这里,阶码用无符号移码表示。用无符号移码表示的好处在于没有了阶符以及方便比较大小。尾数用原码表示。
则任何规格化单精度浮点数可以表示为:
N=(-1)^s * 2^(E-127) *1.M
在这里为什么是1.M?是因为任何规格和浮点数最高位都是1,所以无需单独表示这个1,在数据运算时在恢复最高有效位的表示。
移码作为无符号数,可以表示[0,255],但是对于上式不能表示以0和255为移码表示的浮点数,IEEE754把阶码是255时的浮点数表示为无穷大或非数NaN,而0不能规格化。
习题:
求20.59375的单精度浮点表示
先求出二进制表示 20.59375=[10100.10011]2
把尾码改成1.M的形式,M=1.010010011*2^4
由此知道阶码值为4,则用移码表示为127+4=131=[10000011]移
所以20.59375可以表示为[0 10000011 010010011 00000000000000]