第一步:尾数乘法。 例如:被乘数M=13/16,乘数X=11/16,则乘积P=143/256 仿照实数的手算乘法运算过程: ![]() 上述运算过程与十进制的乘法运算过程一样。由于是二进制运算,实际上不必做乘法。当乘数的某一位为1时,把被乘数加到部分积中,当被乘数为0时,不加被乘数,或加全0即可。 在计算机系统中,最基本的定点乘法是时序乘法,即用移位和加法来实现定点数的乘法。另外,在手算乘法中,部分积不动,每次把被乘数左移。而在计算机系统中,为了硬件实现简单,改为被乘数不动,部分积每次右移。具体计算过程如下: ![]() 开始时部分积P0为全0,部分积的右边是乘数X。每次观察乘数的最右边一位(已经用绿颜色标出),当最右边一位为1时,把被乘数M加到部分积中,如果乘数最右边一位为0,则部分积中不加被乘数;然后把部分积连同乘数一起右移一位,已经使用过的次数的最低位移出去丢掉;反复上述过程n次(n是参加运算的乘数或被乘数的位数)。最后得到的乘积的字长是乘数或被乘数的两倍。 第二步:阶码加。因为阶码通常用移码表示,因此,阶码加法实际上要做移码的加法运算。 移码的加法规则是:开始时与补码加法相同,即把需要相加的两个移码直接相加;然后进行修正,修正的方法很简单,只要把运算结果的符号位变反即可。具体证明过程如下: [X]移=[X]补+2n-1, [Y]移=[Y]补+2n-1,(n是字长) [X+Y]移=[X+Y]补+2n-1=[X]补+[Y]补+2n-1 =([X]补+2n-1)+([Y]补+2n-1)-2n-1 =[X]移+[Y]移-2n-1 ![]() 1010 + 1011,结果为:0101, 修正之后为:1101,即为十进制5的移码表示。 第三步:结果的后处理。后处理可能要做两件事: (1) 可能需要左规格化一位。由于参加运算的乘数和被乘数都是规格化浮点数,他们的尾数的绝对值一定在1/rm到1之间,因此,乘积的绝对值也一定在1/rm2到1之间。 如果乘积在1/rm2到1/rm之间,则乘积要左规格化一位,即把乘积的尾数部分左移一位,并把阶码减1; 如果乘积在1/rm到1之间,则乘积不必规格化。 (2) 判0和判溢出。 |