前导0预测(Leading-Zero Anticipator,LZA)
浮点加法在完成之后会进行尾数规格化移位,而在进行尾数加法时,可以使用前导0预测(Leading-Zero Anticipator,LZA)同时计算移位,前导0预测只发生在一个正数加上一个负数的情况下,电路图如图1所示。

图1 传统LZD算法和LZA算法
1. 基础算法
算法的目标是计算出加法结果序列左边连续0的数量,下文中对序列的位置的索引值是从高位开始到低位的,假设输入尾数为A=a0a1⋯an−1和B=b0b1⋯bn−1,首先需要对A和B进行有效位减法:
R=A−B,R=r0r1⋯rn−1,ri∈{n,z,p}
其中n、z、p代表负(negative)、零(zero)、正(positive),下面分情况讨论。首先考虑3种情况:A>B、A=B、A<B。
1.1 A>B的情况
这种情况下序列R中的第一个不为z的值一定是p,R的序列形式为z(k)p(x),接下来也要分3种情况来讨论:
-
z(k)pp(x)的情况 这种情况下即使x为负,也无法影响序列中k+1位的p,因此前导共有k个0;
-
z(k)pz(x)的情况 此时若x为负需要向前借位,则借位之后第一个p出现在k+2的位置,若x不需要借位,则第一个p仍在k+1位置,但是检测R的码型无法确定第一个p的位置,因此先假设第一个p在k+1的位置,之后进行纠错;
-
z(k)pn(j)(z or p)(x)的情况 其中n的长度为j,将前面k+j+1位借位化简,则得到k+jz⋯z⋯zp(z or p)(x),那么序列中首个p出现在k+j+1或者k+j+2的位置,原因与情况2相同;
在A>B时总结出的情况如下表所示:
|
R的序列码 |
首个p位置 |
判断子序列 |
| z(k)pp(x) |
k+1 |
pp |
|
z(k)pz(x)(x不需要借位) |
k+1 |
pz |
|
z(k)pz(j)(x)(x需要借位) |
k+2 |
pz(需要纠错) |
| z(k)pn(j)p(x) |
k+j+1 |
np |
|
z(k)pn(j)z(x) (x不需要借位) |
k+j+1 |
nz |
|
z(k)pn(j)z(x) (x需要借位) |
k+j+2 |
nz(需要纠错) |
1.2 A<B的情况
这种情况下序列R中的第一个不为z的值一定是n,R的序列形式为z(k)n(x),为了方便讨论,以下会对R的相反数Rˉ进行分析,也就是对z(k)p(y), y=−x进行分析:
-
z(k)nn(x)的情况 与上节分析相同,Rˉ=z(k)pp(x),首个p出现在k+1的位置,由子序列nn(k+1位和k+2位)决定;
-
z(k)nz(x)的情况 对应Rˉ为z(k)pz(y),若子序列(y)不需要借位,则Rˉ的第一个p出现在k+1位,若序列(y)需要向前借位,那么借位由k+1位产生,Rˉ所表示的加法结果序列的第一个p在k+2位。同理若子序列(x)为负需要向前借位(或者为z),R的第一个n出现在k+1位,若子序列(x)为正,则第一个p出现在k+2位。这种情况下会先假设p在k+1位之后进行纠错;
-
z(k)np(j)(z or n)(x)的情况 这种情况化简之后得到R=k+jz⋯z⋯zn(z or n)(x),那么R中的首个n出现在k+j+1或k+j+2位,还是假设n出现在k+j+1,随后进行纠错。
A<B的情况如下表所示:
|
R的序列码 |
首个n位置 |
判断子序列 |
| z(k)nn(x) |
k+1 |
nn |
|
z(k)nz(x)(x不需要借位) |
k+1 |
nz |
|
z(k)nz(j)(x)(x需要借位) |
k+2 |
nz(需要纠错) |
| z(k)np(j)n(x) |
k+j+1 |
np |
|
z(k)np(j)z(x) (x不需要借位) |
k+j+1 |
nz |
|
z(k)np(j)z(x) (x需要借位) |
k+j+1 |
nz(需要纠错) |
3. A=B的情况
不需要编码移位。