Menu Close

浮点运算计算方法 (加减法)

在FPGA浮点运算中, 基本的运算为加、减、乘、除,其他的运算还包括开方,开根号,1/n 等运算。 在FPGA上实现加减乘除的基本运算, 其他运算可以通过基本运算来处理。

数字表示方式:

数字可以使用科学计数法方式表示,举例 12345.678 = 1.2345678 * 104 。所以10进制数都可以通过

(-1)sign * n.f * 10exp   方式来表示。其中n = {1…. 9} ,

如果是2进制数字可以使用

(-1)sign * 1.f * 2exp  方式来表示。

其中 :

sign :用来表示数字的正负值,举例:(-1)0 表示正数; (-1)1表示负数

f:表示分数部分(fraction),即小数部分。举例  10进制数:n.f = 3.456932;  2进制数:1.f = 1.001011101

exp : exponent 指数部分,即2进制或者10进制的指数。 exp 是可以负数,也可以是正数。 举例(-128 ~ 127)。

在计算机系统中或者FPGA中, 10进制数都可以通过2进制方式表达。

1 浮点加减法运算

a + b  运算

a = (-1)s1 * 1.f1 * 2 e1

b = (-1)s2 * 1.f2 * 2 e2

所以 a + b

(-1)s1 * 1.f1 * 2 e1 + (-1)s2 * 1.f2 * 2 e2 =

((-1)s1 * 1.f1 * 2 e1 – e2 + (-1)s2 * 1.f2 )* 2 e2 

2 对阶

小阶向大阶对齐

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

即将指数变为相同以实现加法,规定小阶向大阶对阶,对于指数较小的操作数,需要将尾数向右移位,每移动一位,指数加1,移位直到阶数相等即完成对阶。

举例:

1.1001001 * 27 + 1.00011 * 24 =    (24 < 27, 所以向27 对阶 )

1.1001001 * 27 + 0.000100011 * 27 = 小数点向左移动3位,相当于数字向右移动3位。

(1.1001001  + 0.000100011) * 2

3 求和

对阶后,a + b 的指数部分完全相同, 只需要进行正常的加减法计算就可以了。举例:

a = (-1)s1 * 1.f1 * 2 e1

b = (-1)s2 * 1.f2 * 2 e2

Emax = max(e1,e2)

(-1)s1 * 1.f1 * 2 e1-Emax * 2 Emax + (-1)s2 * 1.f2 * 2 e2-Emax * 2 Emax =

[(-1)s1 * 1.f1 * 2 e1 – Emax + (-1)s2 * 1.f2* 2 e1 – Emax  ] * 2 Emax 

4规格化和舍入

当求和计算完结果之后,需要对结果进行规格化和舍入操作,即完成在标准格式下(比如保留23为的小数部分)重新对结果进行科学计数。保持结果依然为c = (-1)s3 * 1.f3 * 2 e3 方便后续运算使用。

结果的符号及小数部分 = (-1)s1 * 1.f1 * 2 e1 – Emax + (-1)s2 * 1.f2* 2 e1 – Emax

结果的指数部分 2 Emax 

规格化和舍入,就是要对技术结果中的小数部分和指数部分进行修正,是其符合科学计数法。举例:

如果2进制结果为

(1.1 + 1.1) * 27 , 那么 11.0 * 2= 1.00 * 2

 

Posted in FPGA, Verilog, 教材与教案

发表回复

相关链接