浮点加法、减法运算

    1.运算步骤

    假设浮点数的阶码和尾数均用补码表示,在浮点加减运算时,为便于浮点数尾数的规格化处理和浮点数的溢出判断,阶码和尾数均采用双符号位表示。

    ①对阶,小阶向大阶对齐

    两个浮点数进行加减运算时,首先要使两个数的阶码相同,即小数点的位置对齐。若两个数的阶码相同,表示小数点的位置是对齐的,就可以对尾数进行加减运算。反之,若两个数的阶码不相同,表示小数点的位置没有对齐,此时必须使两个数的阶码相同,这个过程称为对阶。

    要对阶,首先应求出两个浮点数的阶码之差,即

    ΔE=[Ex]-[Ey]=[Ex]+[-Ey]

    若ΔE=0,表示两个浮点数的阶码相等,即[Ex]=[Ey];若ΔE>0,表示 [Ex]>[Ey];若ΔE<0,表示[Ex]<[Ey]

    当ΔE≠0时,要通过浮点数尾数的算术左移或算术右移来改变阶码,使两个浮点数的阶码相等。理论上讲,既可以通过移位[Mx]以改变[Ex]来达到[Ex]=[Ey],也可以通过移位[My]以改变[Ey]来达到[Ex]=[Ey]。但是,由于浮点数的尾数在算术左移的过程会改变尾数的符号位,同时,尾数在算术左移的过程中还会使尾数的高位数据丢失,造成运算结果错误。因此,在对阶时规定使小阶向大阶看齐,通过小阶的尾数算术右移以改变阶码来达到[Ex]=[Ey],尾数每右移一位,阶码加1,其数值保持不变,直到两个浮点数的阶码相等,右移的次数等于ΔE的绝对值。

    ②尾数进行加法或减法运算

    对阶结束后,即可对浮点数的尾数进行加法或减法运算。不论是加法运算还是减法运算,都按加法进行操作,其方法与定点加减运算完全一样。

    ③结果规格化并进行舍入处理

    根据规格化浮点数的定义,当尾数用二进制补码表示时,规格化浮点数的尾数形式为00.1××…××或11.0××…××。若浮点数的尾数不是这两种形式,则称之为非规格化浮点数,需进行浮点数的规格化。

    若浮点数的尾数形式为00.0××…××或11.1××…××,应利用向左规格化使其变为规格化浮点数,尾数每算术左移1位,阶码减1,直到浮点数的尾数变成规格化形式。

    若浮点数的尾数形式为01.××…××或10.××…××,表示尾数求和的结果发生溢出,应利用向右规格化使其变为规格化浮点数,尾数算术右移1位,阶码加1,此时浮点数的尾数就变成了规格化形式。

    在对阶或向右规格化时,尾数都要进行算术右移操作,为了保证运算结果的精度,运算过程中需保留右移中移出的若干位数据,称为保护位。在运算结果进行规格化后再按照某种规则进行舍入处理以去除这些数据。舍入处理就是消除保护位数据并按照某种规则调整剩下的部分,舍入处理总要影响到数据的精度。舍入处理的方法通常选用“0舍1入”法。

    ④判断溢出

    浮点数尾数的溢出可通过规格化进行处理,而浮点数运算结果的溢出则根据运算结果中浮点数的阶码来确定。若阶码未发生溢出,则表示运算结果未发生溢出;若阶码溢出,则需进行溢出处理。

    若阶码用双符号位补码表示,判断溢出的方法为:若阶码的双符号位相同,表示结果未发生溢出;若阶码的双符号位不相同,表示结果发生溢出。

    2.举例

    [例1]设两浮点数x=2001×(0.1101),y=2011×(-0.1010),在浮点数的表示格式中阶码占3位,尾数占4位(都不包括符号位)。阶码和尾数均采用含双符号位的补码表示,运算结果的尾数取单字长(含符号位共5位),舍入规则用“0舍1入”法,用浮点运算方法计算x+y、x-y。

    解:[x]=00001,00.1101  [y]=00011,11.0110

    ①对阶,小阶向大阶对齐

    ΔE=[Ex]-[Ey]=[Ex]+[-Ey]=00001+11101=11110

    x的尾数[Mx]右移2位,阶码[Ex]加2

    [x]=00011,00.0011(01)

    其中(01)表示[Mx]右移2位后移出的最低两位数。

    ②尾数进行加法、减法运算

    即[x+y]=00011,11.1001(01)

      [x-y]=00011,00.1101(01)

    ③结果规格化并进行舍入处理

    和的尾数左移1位,阶码减1,采用“0舍1入”法进行舍入处理后,得

      [x+y]=00010,11.0011

    差已为规格化浮点数,采用“0舍1入”法进行舍入处理后,得

      [x-y]=00011,00.1101

    ④判断溢出

    和、差的阶码的双符号位均相同,故和、差均无溢出。

    所以x+y=2010×(-0.1101)

        x-y=2011×(0.1101)

    [例2]设两浮点数x=2-011×(0.100101),y=2-010×(-0.011110),在浮点数的表示格式中阶码占3位,尾数占6位(都不包括符号位)。阶码和尾数均采用含双符号位的补码表示,运算结果的尾数取单字长(含符号位共7位),舍入规则用“0舍1入”法,用浮点运算方法计算x+y、x-y。

    解:[x]=11101,00.100101  [y]=11110,11.100010

    ①对阶,小阶向大阶对齐

    ΔE=[Exx]-[Ey]=[Ex]+[-Ey]=11101+00010=11111

    x的尾数[Mx]右移1位,阶码[Ex]加1

    [x]=11110,00.010010(1)

    其中(1)表示[Mx]右移1位后移出的最低一位数。

    ②尾数进行加法、减法运算

    即[x+y]=11110,11.110100(1)

      [x-y]=11110,00.110000(1)

    ③结果规格化并进行舍入处理

    和的尾数左移2位,阶码减2,得

    [x+y]=11100,11.010010

    差已为规格化浮点数,采用“0舍1入”法进行舍入处理后,得

    [x-y]=11110,00.110001

    ④判断溢出

    和、差阶码的双符号位均相同,故和、差均无溢出。

    所以x+y=2-100×(-0.101110)

        x-y=2-010×(0.110001)



浮点乘法、除法运算

    1.运算步骤

    在浮点乘除运算时,为便于浮点数判断溢出和尾数进行阵列乘除运算运算,假设浮点数的阶码采用双符号位补码表示,尾数采用单符号补码或原码表示。

    浮点乘法、除法运算步骤如下:

    ①阶码相加减

    按照定点整数的加减法运算方法对两个浮点数的阶码进行加减运算。

    ②尾数相乘或相除

    按照定点小数的阵列乘除法运算方法对两个浮点数的尾数进行乘除运算。为了保证尾数相除时商的正确性,必须保证被除数尾数的绝对值一定小于除数尾数的绝对值。若被除数尾数的绝对值大于除数尾数的绝对值,需对被除数进行调整,即被除数的尾数每右移1位,阶码加1,直到被除数尾数的绝对值小于除数尾数的绝对值。

    ③结果规格化并进行舍入处理

    浮点数乘除运算结果的规格化和舍入处理与浮点数加减运算结果的规格化和舍入处理方法相同。并且在浮点数乘除运算的结果中,由于乘积和商的绝对值一定小于1,因此在浮点乘除运算结果进行规格化处理时只存在向左规格化,不可能出现向右规格化。

    ④判断溢出

    浮点数乘除运算结果的尾数不可能发生溢出,而浮点数运算结果的溢出则根据运算结果中浮点数的阶码来确定,溢出的判定和处理方法与浮点加减运算完全相同。

    2.举例

    [例1]设两浮点数x=2-001×(-0.100010),y=2-100×(0.010110),在浮点数的表示格式中阶码占3位,尾数占6位(都不包括符号位),阶码采用双符号位的补码表示,尾数用单符号位的补码表示。要求用直接补码阵列乘法完成尾数乘法运算,运算结果的尾数取单字长(含符号位共7位),舍入规则用“0舍1入”法,用浮点运算方法计算x×y。

    解:[x]=11111,1.011110  [y]=11100,0.010110

    ①阶码相加

    [Ex+Ey]=[Ex]+[Ey]=11111+11100=11011

    ②尾数作直接补码阵列乘法运算

    [Mx]×[My]=1.110100010100

    ③结果规格化并进行舍入处理

    积的尾数左移2位,阶码减2,采用“0舍1入”法进行舍入处理后,得

    [x×y]=11001,1.010001

    ④判断溢出

    乘积的阶码的双符号位相同,故乘积无溢出。

    所以x×y=2-111×(-0.101111)

    [例2]设两浮点数x=2-010×(0.011010),y=2011×(-0.111100),在浮点数的表示格式中阶码占3位,尾数占6位(都不包括符号位),阶码采用双符号位的补码表示,尾数用单符号位的原码表示。要求用原码阵列除法完成尾数除法运算,运算结果的尾数取单字长(含符号位共7位),舍入规则用“0舍1入”法,用浮点运算方法计算x÷y。

    解:[x]=11110,0.011010  [y]=00011,1.111100

    ①阶码相减

    [Exx-Ey]=[Ex]+[-Ey]=11110+11101=11011

    ②尾数作原码阵列除法运算

    [Mx]=0.011010  [My]=1.111100

    商的符号位为:Mxf⊕Myf=0⊕1=1

    令Mx=011010000000,My=111100,其中Mx和My分别为[Mx]和[My]的数值部分,且Mx为双字长

    [Mx]=0011010000000,[My]=0111100,[-My]=1000100

    故得商q=0011011

    所以[Mx÷My]=1.011011

    因此[x÷y]=11011,1.011011

    ③尾数规格化

    商的尾数左移1位,阶码减1。

    [x÷y]=11010,1.110110

    ④判断溢出

    商的阶码的双符号位相同,故商无溢出。

    所以x÷y=2-110×(-0.110110)



Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐