预习浮点数的表示
1、浮点数的表示格式
定义:以适当的形式将比例因子表示在数据中,让小数点的位置根据需要而浮动。我们计算机的容量有限,不可能对每个数都用特别多的位数来表示,比如说2×10^99,这种非常大的数不可能用定点数来表示,所以呢利用浮点数就可以在位数有限的情况下扩大数的表示范围,同时能保持一定的有效精度。
通常情况下,浮点数表示为:N = r^E × M
式子里面r是浮点数阶码的底在计算机中是隐含的,通常情况下r=2。E和M都是带符号的定点数,E叫做阶码,M叫做尾数。其中E的大小越大,能表示的数范围越大,M的位数越大,数的有效精度越高。
浮点数的一般格式:
J是阶符,表示阶码的符号,S是数符,表示浮点数的符号,阶符J和阶码的m位合起来表示浮点数的表示范围和小数点的实际位置,n位尾数反映了浮点数的精度。
2、浮点数的规格化
两种规格化操作:
左规:当浮点数运算结果是非规格化数的时候,要进行规格化操作,将尾数算术左移一位,阶码减1(基数为2时),左规操作可能要进行多次。
右规:当浮点数运算结果尾数出现溢出的时候,将尾数算术右移一位,阶码加1。需要右规操作的时候只需要操作一次。
规格化浮点数的尾数M的绝对值应该满足这样的关系:1/r ≤ |M| ≤ 1(r就是我们的阶码的底,也是基数)。
以r=2为例:
1、原码尾数规格化后:正数为0.1xxxxxx形式,最大值为0.11......1;最小值为0.100......0。负数为1.1xxxxxx形式,最大值表示为1.10......0;最小值表示为1.11......1。
2、补码尾数规格化后:正数同原码正数。负数为1.0xxxxxx形式,最大值表示为1.01......1;最小值表示为1.00......0。
需要注意的是基数,刚刚是以基数为2时的规格化形式,补码规格化数的尾数最高位一定与尾数符号位相反。基数不同的时候,规格化的形式不同,当基数为4时,原码规格化形式的尾数最高两位不全为0;基数为8时,原码规格化形式的尾数最高三位不全为0。
如何判断一个浮点数是否是规格化数:规格化浮点数的尾数小数点后的第一位一定是个非零的数。因此对于原码编码的尾数来说,只要看尾数的第一位是否为1就行;对于补码表示的尾数,只要看符号位和尾数最高位是否相反。(IEEE 754标准的浮点数尾数是用原码编码的)
3、IEEE 754标准
IEEE 754标准采用的浮点数的格式:
ms为数符,表示浮点数的符号,E为阶码部分,用移码表示,M是尾数部分,用原码表示。
IEEE 754标准规定常用的浮点数格式有短浮点数(单精度、float)、长浮点数(双精度、double型)、临时浮点数。
短浮点数数符占1位;阶码占8位,以2为底,用移码表示,阶码偏置值为127(阶码全1表示无限大,E的范围是1~254,空出全0表示非规格化数);尾数部分为23位。
长浮点数数符占1位;阶码占11位,以2为底,用移码表示,阶码偏置值为1023(阶码全1表示无限大,E的范围是1~2046,空出全0表示非规格化数);尾数部分为52位。
在IEEE754标准中长浮点数和短浮点数的尾数采用隐藏位策略的原码表示,什么意思呢。举个例子来说,以短浮点数为例,尾数占23位。我们知道,规格化浮点数后,尾数最高位一定是一位有效值,对于二进制浮点数来说,尾数最高位一定是1,那么我们为了充分利用资源,既然最高位一定是1了,我们干脆就把它隐藏好了,因此尾数实际上是24位,在表示的时候尾数23位是纯小数。比如说十进制12(1100),转化为二进制浮点数规格化后为1.1×2^3,这里我们就把整数部分的1 隐藏了,整数部分的1不存在23位尾数中,存的时候就是这样的32位:0 1000 0010 1000 0000 0000 0000 0000 000。