一.错题回顾
长度相同但格式不同的两种浮点数,假设前者基数大,后者基数小,其他规定均相同,则他们可表示的数的范围和精度为( )
A. 两者可表示的数的范围和精度相同
B. 前者可表示的数的范围大但精度低
C. 后者可表示的数的范围大且精度高
D. 前者可表示的数的范围大且精度高
解析:B。基数越大,范围越大,但精度变低(数变稀疏)。
总结:范围与精度二者不能兼顾。
在规格化浮点运算中,若某浮点数为 25x1.10101, 其中尾数为补码表示,则该数( )
A. 不需规格化
B. 需右移规格化
C. 需将尾数左移一位规格化
D. 需将尾数左移两位规格化
解析:C。很明显该数是负数,当负数的尾数为补码表示,且为 1.0……形式时为规格化数,因此该尾数左移一位,阶码同时应减1,才为规格化数。
下列关于对阶操作说法正确的是( )
A. 在浮点加减运算的对阶操作中,若阶码减小,则尾数左移
B.在浮点加减运算的对阶操作中,若阶码增大,则尾数右移;若阶码减小,则尾数左移
C. 在浮点加减运算的对阶操作中,若阶码增大,则尾数右移
D.以上都不对
解析:C。对阶操作,是将较小的阶码调整到与较大的阶码一致,因此不存在阶码减小、尾数左移的情况。
下列说法中,正确的是( )
I. 在计算机中,表示的数有时会发生溢出,根本原因是计算机的字长有限
II. 8421 码就是二进制数
III. 一个正数的补码和这个数的原码表示一样, 而正数的反码是原码各位取反
IV. 设有两个正的规格化浮点数N1=2m * M1和N2=2n * M2,若m>n,则有N1>N2。
A. I、II
B. II、 III
C. I、III、IV
D. I、IV
解析:D。I正确;8421码是十进制数的二进制编码,II错误;正数的原码、反码和补码都相同,III错误;因为是规格化正浮点数,所以M1、M2均为 0.1……形式,有N1阶码至少比N2大1,所以N1>N2,IV
正确。
设浮点数共12位。其中阶码含1位阶符共4位,以2为底,补码表示;尾数含1位数符共8位,补码表示,规格化。则该浮点数所能表示的最大正数是( )
A.27
B. 28
C. 28- 1
D. 27-1
解析:D。为使浮点数取正数最大,可使尾数取正数最大,阶码取正数最大。尾数为8位补码(含符号位),正值最大为0.1111111即1-27, 阶码为4位补码(含符号位),正值最大为0111, 即7。则最大正数为(1-27)x27=27-1。
注意:可能有人认为尾数正值最大包含隐藏最高位1,为1.1111111即2-27。注意这里不是IEEE标准,只有在IEEE标准下才会有最高位隐藏1。
浮点数加、减运算过程一般包括对阶、尾数运算、规格化、舍入和判断溢出等步骤。设浮点数的价码和尾数均采用补码表示,且位数分别为5和7 (均含2位符号位)。若有两个数X =27 * 29/32 和 Y =25 * 5/8, 则用浮点加法计算X + Y的最终结果是( )
A. 00111 1100010
B. 00111 0100010
C. 01000 0010001
D. 发生溢出
解析:D。X的浮点数格式为00,111;00 ,1101 (分号前为阶码,分号后为尾数), Y的浮点数格式为00,101; 00,10100。然后根据浮点数的加法步骤进行运算。
对阶。X、Y阶码相减,即00,111-00,101=00, 111 + 11, 011= 00, 010, 可知X的阶码比Y的价码大2 (这一步可直接目测)。根据小阶向大阶看齐的原则,将Y的阶码加2,尾数右移2位,将Y变为00, 111; 00, 00101。
尾数相加。即00, 11101 + 00, 00101= 01, 00010, 尾数相加结果符号位为01,因此需要右规。
规格化。将尾数右移1位,阶码加1,得X+ Y为01,000;00,10001。
判断溢出。阶码符号位为01,说明发生溢出。
IEEE 754单精度浮点格式表示的数中,最小的规格化正数是( )
A.1.0x2 -126
B. 1.0x2-127
C.1.0x2-128
D.1.0x2 -149
解析:A。IEEE 754单精度浮点数的符号位、阶码位、尾数位(省去正数位1)所占的位数分别是1、8、23。最小正数,数符位取0,移码的取值范围是1~254, 取1,得阶码值1- 127= -126 (127为我们规定的偏置值),尾数取全0,最终推出最小规格化正数为A选项。
已知带符号整数用补码表示,float 型数据用IEEE 754标准表示,假定
变量x的类型只可能是 int 或float,当x的机器数为C800 0000H时,x的值可能是( )
A. -7 * 227
B. -216
C. 217
D. 25 * 227
解析:A。C800 0000H= 1100 1000 0000 0000 0000 0000 0000 0000。将其转换为对应的float型或int型。
1)若为float型,则尾数隐藏最高位1,数符为1表示负数,阶码1001 0000=27+24= 128+ 16,再减去偏置值127得到17,算出x值为-217。
2)若为int型, )则带符号补码,为负数,数值部分取反加1,得 011 1000 0000 0000 0000 0000 0000 0000算出x值为-7 * 227。
二.知识点梳理
1.认识浮点数
1.1浮点数的表示形式
通常,浮点数表示为 N=(-1)s * M * RE。式中,S取值0或1,用来决定浮点数的符号;M是一个二进制定点小数,称为尾数,一般用定点原码小数表示; E是一个二进制定点整数,称为阶码或指数,用移码表示。R是基数(隐含),可以约定为2、4、16等。可见浮点数面数符、尾数和阶码三部分组成。
例子:
其中,第0位为数符S;第1~7位为移码表示的阶码E (偏置值为64);第8~31位为24位二进制原码小数表示的尾数M;基数R为2。阶码的值反映浮点数的小数点的实际位置:阶码的位数反映浮点数的表示范围:尾数的位数反映浮点数的精度。
1.2 浮点数的表示范围
运算结果大于最大正数时称为正上溢,小于绝对值最大负数时称为负上溢,正上溢和负上溢统称上溢。数据一旦产生上溢,计算机必须中断运算操作,进行溢出处理。当运算结果在0至最小正数之间时称为正下溢,在0至绝对值最小负数之间时称为负下溢,正下溢和负下溢统称下溢。数据下溢时,浮点数值趋于零,计算机仅将其当作机器零处理。
1.3 浮点数的规格化
尾数的位数决定浮点数的有效数位,有效数位越多,数据的精度越高,为了在浮点数运算过程中尽可能多地保留有效数字的位数,使有效数字尽量占满尾数数位,必须在运算过程中对浮点数进行规格化操作。所谓规格化操作,是指通过调整一个非规格化浮 点数的尼数和阶码的大小,使非零的浮点数在尾数的最高数位上保证是一个有效值。
左规:当运算结果的尾数的最高数位不是有效位,即出现0.0……的形时,需要进行左规。左规时,尾数每左移一一位 (阶码减)(基数为2时).左规可能要进行多次。
右规:当运算结果的尾数的有效位进到不数点前面时,需要进行右规。将尾数右移一位、阶码加1(基数为2时)。需要右规时,只需进行一次。
原码表示的规格化尾数的形式如下:
1)正数为0.1……的形式,其最大值表示0.1111……最小值表示0.1000……. 。尾数的表示范围为1/2≤M≤(1-2n)。
2)负数为1.1……的形式,其最大值表示为1.1000……, 最小值表示为1.1111…… 。 尾数的表示范围为-(1- 2n)≤M≤-1/2。
基数不同,浮点数的规格化形式也不同。当浮点数尾数的基数为2时,原码规格化数的尾数最高位一定是1。当基数为4时,原码规格化形式的尾数最高两位不全为0。
1.4 IEEE标准
IEEE 754标准中,规格化的短浮点数的真值为 (-1)s * 1.M * 2E-27
规格化长浮点数的真值为(-1)s * 1.M * 2E-1023
式中,短浮点数E的取值为1~254 (8位表示),M为23位,共32位:长浮点数E的取值为1~2046(11位表示),M为52位,共64位。
三.浮点数的加减运算
个人理解
对阶。先求阶差,将阶码小的右移直到两个数的阶码相等为止。
尾数求和。对阶后的尾数按定点数运算规则运算。
规格化。看情况左规和右归。
舍入。在对阶和尾数右移时进行。
溢出判断。以指数的溢出来判断,尾数溢出可以通过右归操作纠正。
例子
例:已知十进制数X=-5/256、 Y=+59/1024 ,按机器补码浮点运算规则计算X- Y ,结果用二进制表示,浮点数格式如下:阶符取2位,阶码取3位,数符取2位,尾数取9位。
解:
五.常见问题与易混淆知识点
1.定点、浮点表示的区别
(1) 数值的表示范围
若定点数和浮点数的字长相同,则浮点表示法所能表示的数值范围远大于定点表示法。
(2)精度对于字长相同的定点数和浮点数来说,浮点数虽然扩大了数的表示范围,但精度降低了
(3) 数的运算
浮点数包括阶码和尾数两部分,运算时不仅要做尾数的运算,还要做阶码的运算,而且运算结果要求规格化,所以浮点运算比定点运算复杂。
(4)溢出问题
在定点运算中,当运算结果超出数的表示范围时,发生溢出:浮点运算中,运算结果超出尾数表示范围却不一定溢出,只有规格化后阶码超出所能表示的范围时,才发生溢出。
2.如何判断一个浮点数是否是规格化数?
解:为了使浮点数能尽量多地表示有效位数,一般要 求运算结果用规格化数形式表示。规格化浮点数的尾数小数点后的第一位一 定是个非零数。 因此,对于原码编码的尾数来说,只要看尾数的第一位是否为1 就行:对于补码表示的尾数,只要看符号位和尾数最高位是否相反。需要注意的是,IEEE754标准的浮点数尾数是用原码编码的。
3.对于位数相同的定点数和浮点数,可表示的浮点数个数比定点数个数多吗?
解:不是,可表示的数据个数取决于编码所采用的位数。编码位数定, 编码出来的数据个数就是一定的。n位编码只能表示2n个数,所以对于相同位数的定点数和浮点数来说,可表示的数据个数应该一样多(有时可能由于一个值有两个或多个编码对应,编码个数会有少量差异)。
4.浮点数如何进行舍入?
舍入方法选择的原则是:
①尽量使误差范围对称,使得平均误差为0,即有舍有入,以防误差积累。
②方法要简单,以加快速度。IEEE 754有以下4种舍入方式:
①就近舍入:舍入为最近可表示的数,若结果值正好落在两个可表示数的中间,则般选择舍入结果为偶数。
②正向舍入:朝+∞方向舍入,即取右边的那个数。
③负向舍入:朝-∞方向舍入,即取左边的那个数。
④截去:朝0方向舍入,即取绝对值较小的那个数。
5.现代计算机中是否要考虑原码加减运算?如何实现?
因为现代计算机中学点数采用EE 754标准。所以在进行两个浮点数的加减运算时,必须考虑原码的加减运算,因为EEE 754规定浮点数的尾数都用原码表示。
原码的加减运算可以有以下两种实现方式:
1)转换为补码后,用补码加减法实现,结果再转换为原码。
2)直按用原码进行加成运算,符号和数值部分开进行(具体过程见原码加减运算部分)。
六.补充
可以与上一篇定点数运算形成对比:定点数运算