|||
用限位数方法设计精确浮点加减法运算器
姜咏江
(对外经济贸易大学信息学院 北京 100013)
摘要:仅用二进制补码制来说明机器如何表示数值运算,存在多方面的缺失,很难说清楚机器计算的理论依据,并带来了设计冗余和资源的浪费。限位数不用书写正负号就可以表示有符号数。只用无符号数做加法就能够进行加减运算。用限位数方法设计浮点运算器,阶码不用引进移码就能够方便进行计算,而且能够方便进行尾数扩充,得到精确的计算结果。
关键词:计算机体系结构,限位数,硬件设计,软件设计
中图分类号:TP301,TP311
Design Exact Float’s ADD/SUB with the Fixed-Length Number
Jiang Yongjiang
(School of Information Technology & Management Engineering,UIBE,Beijing 100013)
:
Abstract: Only use Binary-complement to explain the machine how to represent numerical computation, there are many losses. It is difficult to clarify the theoretical basis for machine-computation and bring the design redundancy and waste of resources. The Fixed-length number can express the value not use the '-' or '+' symbol. Only use unsigned addition will be able to carry out addition and subtraction. Use the Fixed-length number to design the float’s ADD/SUB, Exponent no need to shift and can facilitate the mantissa expansion, get accurate results.
Key words: architecture, fixed-length number, hardware, software
1 引言国际标准化组织给出的单精度IEEE754标准(见图 1)将32位数用一位表示尾数的正负号,8位做阶码,尾数23位,并且做了如下规定:
(1) 如果阶码E=0,并且尾数M=0,这个数是±0(和符号位相关);
(2) 如果阶码E=2255-1,并且尾数M=0,这个数是±无穷大(同样和符号位相关);
(3) 如果阶码E=22551,并且尾数M≠0,这不是一个数(NaN)。
图 1 IEEE754浮点数的格式
计算机浮点数是数学“科学记数法”表达的数,一般形式为:M×2E,这种形式可以与定点数通过移动小数点的方法自由转换。IEEE754标准的规定不仅使一定长度数码表数范围减少了,而且失去了运用浮点数进行精确计算的可能。
本文根据限位数理论和方法[1]设计了32位可实现精确计算的浮点数加减法运算器,阶码8位,尾码24位,没有尾码的符号位。阶码E的值是-128~+127的所有整数,不论24位尾码M如何,32位浮点格式都表示惟一确定的数。通过保留移出数据的方式,该浮点运算器就能够运用于任意范围的浮点数精确计算。
2 限位浮点数的表示限位数理论使用数码原样排列的算术运算来完成数值计算,同样也适合浮点数算数运算。
2.1 限位数和对称制我们将位数固定只用数码表示的数叫“限位数”。为了表示出限位数的长度,无效数码不能够省略。两限位数之和为数的总数,那么一个叫另一个“对称数”。因而0和负数没有对称数。两个数码之和为最大数码时,一个叫另一个数码的“反码”。一个限位数的对称数可以用“求反加一”得到。用较大的限位数来表示其对称数的相反数,0就是0,这就是比补码制更一般化的“对称制”[2]。对称制中判断数的正负只要与对称点比较即可。限位数可以直接表示一定范围的正负数,不用在运算过程中转换。保值扩充限位数,正数添“0”,负数添最大数码。
例如,3位十进制的限位数是000~999,总数是1000个,其中较大的一半501~999的每个数都表示较小一半对称数499~001的相反数,对称点500的对称数是自身,这种情况规定为负数(基数是奇数时没有这种情况)。
2.2 用限位数表示浮点数浮点数的限位数表示不必分为单精度或双精度,也不必将阶码用移码表示,数码的直接运算就能得到任何精确度的计算结果。由y=M×2E函数的性质知,阶码E的值越大,2E的值越大。按着我们这里规定的阶码8位,尾码24位,浮点数直接表数范围应为: -0.8388608×2127~+0.8388607×2127,阶码的变化范围是-128~+127的整数。
需要指出,限位数小数点的左方是不能够随便添加“0”的,原因是限位数的最高位数码关系到该数的正负,并且小数点左面有数码就会增加限位数的位数。例如,0.866和.866在限位数表示中是不同值的,前者是一个4位正数,而后者是一个3位的负数。如果将后者变为4位数,左面的最高位应是添最大数码9,那么应有.866 = 9.866。因为浮点数尾数的小数点隐含在左边的位置,并且对阶时是将较小阶码的尾数右移进行的,因而不会出现小数点左面添0的情况。
3 可精确计算的浮点运算器设计限位浮点数加减法器的设计要分为对阶和计算两大步骤。对阶不会产生阶码溢出,如果用24位加减法器来进行第二步工作,那么设计时要考虑数据位数扩充问题。
3.1 设计思想计算机浮点运算的不精确来自于单精度或双精度的浮点数不能根据需要进行位数扩充。浮点数在尾数移位的过程中,由于位数限制,阶码小的尾数右移时就会丢失掉一些有效数字。如果将丢失的有效数值随时能够捡回来,那么就可以实现精确的计算。
图 2所示是两个浮点数精确加减运算的流程,其特点是直接将存储形式的数据A、B分离阶码和尾码,然后对阶和计算,移出的尾数如果包含有效数字,则将移出部分适当变化后添加到结果的尾部。
图 2 浮点数精确加减运算流程
借助于存储器我们可以将移出的尾数保留起来,这样可以根据计算的需要,改变尾数的长度。当使用固定长度的浮点加减法运算器完成超长尾数的浮点数运算时,只要将超长的尾数进行分段加减运算处理,就可以确保得到精确的运算结果。
3.2 可精确计算的浮点加减法器运算实例根据前面提到的设计思想,作者设计了浮点数加减运算器。下面给出这个浮点运算器三张仿真图,借此来展示浮点数精确计算设计的可行性。
8位阶码对阶时,尾码保值移动最大为255位。仿真图 3的Name栏下sub=1做减法,sub=0做加法;f_a与f_b是参加运算的两个32位浮点数;remain显示移位后得到的尾数;f_out显示加减运算24位的结果;256位的space显示被移出的尾码,mov_f是移出不为0的标志;over是尾数加减运算溢出标志;osign显示f_a阶码与f_b阶码的差,为防止判定大小时溢出定为9位编码,最高位为1指示差为负。
|
图 3 阶码最小最大的两数相加减
图 3中f_a阶码是最小数8’h80,f_b阶码是最大数8’h7F,因而差是负数9’h101,距离为9’h0FF,说明f_a的尾数右移了255位。也即是24’h999999右移了255位,因为它是负数,故保值右移应该用“1”补位,于是space的前231位都是1,而space的最低位保持初始值0,故而我们见到space的低十六进制位是24’h333332,其余位全是“F”。稳定的运算输出需要3个时钟周期,故图中由加变到减运算时,over出现3个节拍的溢出显示,此时的判断和减法运算无关。
如果我们要得到这两数加法运算的精确值,只要将space的有效数字添加在结果的后面即可。如果是做减法,并且space是f_b的移出,那么要“求反加一”,并且这种space“求反加一”没有向上的进位时,还要将结果f_out的尾码减一之后与变化的space相连。
图 4中两浮点数的阶码都是负数,8’hB0 = -80,8’hA3 = -93,故8’hB0 > 8’hA3,f_b的尾码24’b001100100101010101110111要右移13位,得剩余为24’b000000000000000110010010=24’h000192,移出的部分是=16’hABB8。尾码加法的近似结果是24’h6545AA,尾码减法的近似结果是24’h654286。加法运算的精确结果是40’h6545AAABB8;而减法运算需要先求移出的16’b1010101110111000对称码,即有16’b0101010001000111 + 1’b1 = 16’b0101010001001000 = 16’h5448,再连接减法运算的“结果减一”,得到减法运算精确结果40’h6542855448。
由于精确计算只考虑移出的有效数字不是0,而不是0的限位数对称码不会产生进位,因而当移动的是f_b的尾数时,减法运算的精确结果获得必须用尾数差的结果减一后去连接移出部分的对称码。
图 5验证的是阶码相同正数浮点数加减运算,由于移出到space中没有有效数字,故得到的加减运算结果都应该是精确的,但加法运算的结果溢出。要解决溢出,需要将公共阶码提高单位1,也就是要将两数的尾码都右移一位,这用软件的方法就可以完成。
图 4 阶码都是负数的加减运算
图 5 阶码相同的加减运算
4 结论计算机运算器电路设计当中,一般用所谓的二进制的“补码制”,会用很多种“碰值”的手段来完成运算器的设计,这样常会“漏掉”边界值。这里运用“限位数”进行能精确计算的浮点数电路设计,不仅简单易行,节省器件资源,而且在理论上能够透彻地解释机器数值运算问题,为软硬件结合浮点数运算的精确性提供了可行的方法。
参考文献
[1] 姜咏江·计算机设计的基础理论限位数·2009中国计算机大会论文集·p362
[2] 姜咏江·补码制理论的理解·北京,计算机工程与应用·2004.5
[3] 姜咏江·计算机原理综合课程设计·北京,清华大学出版社·2009.6
|
姜咏江 CCF/CIE高级会员。对外经济贸易大学副教授。主研计算机理论与设计方法,系统结构,操作系统等。 E_mail:accsys@126.com |
Archiver|手机版|科学网 ( 京ICP备07017567号-12 )
GMT+8, 2024-12-22 21:25
Powered by ScienceNet.cn
Copyright © 2007- 中国科学报社