浮点数的表示与运算

2022.08.31

视频推荐:

  1. 十分钟搞定期末与考研常考的普通浮点数与IEEE754浮点数
  2. 浮点数小结

浮点数的表示

浮点数的表示格式

(1)N=(1)SMRE

32位浮点数格式(基数默认为2):

数符(0)阶码(1-7)尾数(8-31)
共1位移码,偏执值为64,共7位原码,共24位

浮点数的表示范围

正数(0.1xxxx):最大值0.1111···1,最小值0.100···0,范围0[212128,(1224)2127]

负数(1.1xxxx):最小值1.1111···1,最大值1.100···0,范围[(1224)2127,212128]0

上溢:进行中断处理

下溢:当作0处理

img

注意⚠️:

  1. 正数尾数最小值,负数尾数最大值,需要是x.1xxxxx!(基数为2时)
  2. 注意负数的上溢下溢范围!

浮点数的规格化

左规:出现 ± 0.000···0时,尾数左移n位,阶码减n

右规:尾数有效位进位到小数点前边,尾数右移1位,阶码加1

基数为2时,原码规格化形式的尾数最高位是1

基数为4时,原码规格化形式的尾数最高两位不全为0

IEEE754标准

img

阶码:原码数值+偏执值

尾数:带隐藏位的原码

类型数符阶码尾数数值总位数偏执值
短浮点数1823327FH(127)
长浮点数11152643FFH(1023)
临时浮点数11564803FFFH(16383)

记忆方案:

Float 32 -> 8 + (1+23),(和前边的浮点数一样,只不过有了隐含位)

Double 64 -> 11 + 52 + 1, “一生一世我爱你”

临时浮点数 80 -> (1+15) + 64

8 11 15,“八十一是我,王氏一是你”

23 52 64

注意⚠️:

这里的偏执值是 2k1 ,和普通的移码不一样!(普通的移码没有减1!)

(2)(1)S1.M2E127(1)S1.M2E1023(1)S1.M2E16383

img

小结:

内容阶码尾数
浮点数原码+偏置值2n原码(0.1abcd,保存1abcd)
IEEE 754原码+偏置值2n1原码(带隐藏位:1.abcd,保存abcd)

例题:

2)X和Y相加后的结果存放在C寄存器中,寄存器C中的内容是什么?

(23)(1.000100H26+1.00001H23)(24)=(1.000100H26+0.00100001H26)(25)=(1.00110001H26)(26)=1,10000101(6+127),00110001(27)=C2988000

3)X和Y相减后的结果存放在D寄存器中,寄存器D中的内容是什么?

(28)1.00001H231.000100H26(29)=0.00100001H261.000100H26(30)=(1.00010000H260.00100001H26)(31)=(0.11101111H26)(32)=(1.1101111H25)(33)=1,10000100(5+127),1101111(34)=C26F0000

定点、浮点表示的区别

(1)数值的表示范围

若定点数和浮点数的字长相同,则浮点表示法所能表示的数值范围远大于定点表示法。

(2)精度

对于字长相同的定点数和浮点数来说,浮点数虽然扩大了数的表示范围,但精度降低了。

(3)数的运算

浮点数包括阶码和尾数两部分,运算时不仅要做尾数的运算,还要做阶码的运算,而且运算结果要求规格化,所以浮点运算比定点运算复杂。

(4)溢出问题

在定点运算中,当运算结果超出数的表示范围时,发生溢出;浮点运算中,运算结果超出尾数表示范围却不一定溢出,只有规格化后阶码超出所能表示的范围时,才发生溢出。

浮点数的加减运算

  1. 对阶

    对阶的目的是使两个操作数的小数点位置对齐,即使得两个数的阶码相等。为此,先求阶差,然后以小阶向大阶看齐的原则,将阶码小的尾数右移一位(基数为2),阶加1,直到两个数的阶码相等为止。尾数右移时,舍弃掉有效位会产生误差,影响精度。

  2. 尾数求和

    将对阶后的尾数按定点数加(减)运算规则运算。运算后的尾数不一定是规格化的,因此,浮点数的加减运算需要进一步进行规格化处理。

  3. 规格化

    IEEE754规格化尾数的形式为±1.×...×。尾数相加减后会得到各种可能结果,例如:

    1.×...×+1.×...×=±1×,×...×

    1.×...×-1.×...×=±0.0...01×...×

    1)右规:当结果为±1×.×…×时,需要进行右规。尾数右移一位,阶码加1。尾数右移时,最高位1被移到小数点前一位作为隐藏位,最后一位移出时,要考虑舍入。

    2)左规:当结果为士0.0…01×…×时,需要进行左规。尾数每左移一位,阶码减1。.可能需要左规多次,直到将第一位1移到小数点左边。

    注意:①左规一次相当于乘2,右规一次相当于除2;②需要右归时,只需进行一次

  4. 舍入

    在对阶和尾数右规时,可能会对尾数进行右移,为保证运算精度,一般将低位移出的两位保留下来,参加中间过程的运算,最后将运算结果进行舍入,还原表示成IEEE754格式。

    常见的舍入方法有:0舍1入法恒置1法截断法(恒舍法)

    1. 0含1入法:类似于十进制的“四合五入”法。运算结果保留位的最高数位为0,则舍去;最高数位为1,则在尾数的末尾+1。这样可能有导致溢出,需要再次右归。
    2. 恒置1法:只要因移位而丢失的位中有1,就把尾数末位置1,而不管原来是0,还是1
    3. 截断法:直接截取所需位数,丢弃后面的所有位,这种舍入处理最简单。
  5. 溢出判断

    在尾数规格化和尾数舍入时,可能会对阶码执行加/减运算。因此,必须考虑指数溢出的问题。若一个正指数超过了最大允许值(127或1023),则发生指数上溢,产生异常。若一个负指数超过了最小允许值(-149或-1074),则发生指数下溢,通常把结果按机器零处理。

    1)右规和尾数舍入。数值很大的尾数舍入时,可能因为末位加1而发生尾数溢出,此时需要通过右规来调整尾数和阶。右规时阶加1,导致阶增大,因此需要判断是否发生了指数上溢。当调整前的阶码为11111110时,加1后,会变成11111111而发生指数上溢。

    2)左规。左规时阶减1,导致阶减小,因此需要判断是否发生了指数下溢。其判断规则与指数上溢类似,左规一次,阶码减1,然后判断阶码是否为全0来确定是否指数下溢。由此可见,浮点数的溢出并不是以尾数溢出来判断的,尾数溢出可以通过右规操作得到纠正。运算结果是否溢出主要看结果的指数是否发生了上溢,因此是由指数上溢来判断的。

    注意:某些题目可能会指定尾数或阶码采用补码表示。通常采用双符号位,当尾数求和结果溢出(如尾数为10.×…×或01.××…×)时,需右规一次;当结果出现00.0××…×或11.1××…×时,需要左规,直到尾数变为00.1××…×或11.0××…×。

  6. 例题

    • 【例题】下列关于对阶操作说法正确的是()。

      A. 在浮点加减运算的对阶操作中,若阶码减小,则尾数左移

      B. 在浮点加减运算的对阶操作中,若阶码增大,则尾数右移;若阶码减小,则尾数左移

      C. 在浮点加减运算的对阶操作中,若阶码增大,则尾数右移

      D. 以上都不对

      答案:C。⚠️这道题说的是浮点数对阶操作中!小阶向大阶对齐

    • 【例题】设浮点数共12位。其中阶码含1位阶符共4位,以2为底,补码表示;尾数含1位数符共8位,补码表示,规格化。则该浮点数所能表示的最大正数是()。

      答案:27(127)=271。⚠️只有IEEE754才有隐藏位呢!阶码最大:231=7;尾数最大:0.1111111=127

    • 【例题】采用规格化的浮点数最主要是为了(D)。

      A.增加数据的表示范围.

      B.方便浮点运算

      C.防止运算时数据溢出

      D.增加数据的表示精度

    • 【例题】下列关于舍入的说法,正确的是()。

      Ⅰ.不仅仅只有浮点数需要舍入,定点数在运算时也可能要舍入

      Ⅱ.在浮点数舍入中,只有左规格化时可能要舍入

      Ⅲ.在浮点数舍入中,只有右规格化时可能要舍入

      Ⅳ.在浮点数舍入中,左、右规格化均可能要舍入

      V.舍入不一定产生误差

      答案:只有V:只有浮点数有舍入的概念。舍入的两种情况:对阶&规格化

    • 【2009统考真题】浮点数加、减运算过程一般包括对阶、尾数运算、规格化、舍入和判断溢出等步骤。设浮点数的阶码和尾数均采用补码表示,且位数分别为5和7(均含2位符号位)。若有两个数X=2^7×29/32 和Y=2^5x5/8,则用浮,点加法计算X+Y的最终结果()。 A. 00111 1100010 B. 00111 0100010 C. 01000 0010001 D. 发生溢出 答案:D

      (38)X=27×29/32(39)Y=25×5/8=27×5/32(40)X+Y=27×34/32=0,00111,(25)
    • 【2011统考真题】float型数据通常用IEEE754单精度格式表示。若编译器将float型变量x分配在一个32位浮点寄存器FR1中,且X=-8.25,则FR1的内容是()。

      A.C1040000H

      B.C2420000H

      C.C1840000H

      D.C1C20000H

      答案:A。⚠️要化成1.xxx才是规格化!不是0.1xxx。。

      (41)8.25(42)=[1][][8.25](43)=[1][][1000.01](44)=[1][127+3][1.00001](45)=[1][10000010][00001](46)=1100|0001|0000|0100|...(47)=C1040000H
    • 【2012统考真题】float类型(IEEE754单精度浮点数)能表示的最大整数是?

      答案:⚠️阶码全是1,尾数全是零的时候代表正负无穷!代表普通的数字需要阶码<全是1的情况

      (48)0[11111110][1111...111](49)11111110=254127=127(50)21271.111...111(51)=2127(2223)(52)=21282104
    • 【2013统考真题】某数采用IEEE754单精度浮点数格式表示为C6400000H,该数的值是:

      答案:

      (53)C6400000(54)=1100,0110,0100,0000,0000,0000,0000,0000(55)=210001100B1271.10000000000000000000000B(56)=1.5213
    • 【2014统考真题】float型数据常用IEEE754单精度浮点格式表示。假设两个float型变量x和y分别存放在32位寄存器f1和f2中,若(f1)=CC90 0000H,(f2)=B0C0 0000H,则x和y之间的关系为()。

      A.x<y且符号相同

      B.x<y且符号不同

      C.x>y且符号相同

      D.x>y且符号不同

      (57)CC900000H110011001001000000000000000000002261.125B0C00000H101100001001000000000000000000002301.125

      答案:A

    • 【2015统考真题】下列有关浮点数加减运算的叙述中,正确的是( )。

      I.对阶操作不会引起阶码上溢或下溢 Ⅱ.右规和尾数舍入都可能引起阶码上溢 Ⅲ.左规时可能引起阶码下溢 IV.尾数溢出时结果不一定溢出

      A.仅Ⅱ、III

      B.仅I、Ⅱ、IV

      C.仅I、Ⅲ、IV

      D.I、Ⅱ、Ⅲ、IV

      答案:对阶是较小的阶码对齐至较大的阶码,I正确。右规和尾数舍入过程,阶码加1而可能上

      溢,Ⅱ正确,同理IⅡ也正确。尾数溢出时可能仅产生误差,结果不一定溢出,V正确。D

    • 【2018统考真题】IEEE754单精度浮点格式表示的数中,最小的规格化正数是( )。

      A.1.0×2126

      B.1.0×2127

      C.1.0×2128

      D.1.0×2149

      答案:A

      阶码:00000001=1127=126

    • 【2020统考真题】已知带符号整数用补码表示,float型数据用IEEE754标准表示,假

      定变量x的类型只可能是int或float,当x的机器数为C8000000H时,x的值可能是()

      A.7×227

      B.216

      C.217

      D.25×227

      答案:A

      (58)C8000000int(59)=11001000000000000000000000000000(60)=10111000000000000000000000000000(61)=7227(62)=C8000000float(63)=11001000000000000000000000000000(64)=1,10010000,0(65)=217
    • 【2021统考真题】下列数值中,不能用IEEE754浮点格式精确表示的是()。

      A.1.2

      B.1.25

      C.2.0

      D.2.5

      答案:A