浮点数表示

427 阅读3分钟

浮点数表示

  1. 什么是浮点数?

定点数就是小数点位数位置固定不变,相反浮点数就是小数点的位置可以变化。

  1. 浮点数的表示形式

任何一个二进制数都可以表示成如下形式:

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]