Chapter3 算术运算
3.1 乘法器
3.1.1 乘法器-Version 1
这是最符合人的计算思维的一个运算方式,以图片中的数字为例,各个寄存器内部的值为:
乘数最低位 | 被乘数寄存器 | 乘数寄存器 | 积寄存器 |
---|---|---|---|
(初始化) | 0000 0010 | 0000 0011 | 0000 0000 |
1 | 0000 0100 | 0000 0001 | 0000 0010 |
1 | 0000 1000 | 0000 0000 | 0000 0110 |
0 | 0001 0000 | 0000 0000 | 0000 0110 |
0 | 0010 0000 | 0000 0000 | 0000 0110 |
3.1.2 乘法器-Version 2
以0001 x 0111为例:
计算 | 乘数最低位 | 被乘数寄存器 | 乘数寄存器 | 积寄存器 | 步骤 |
---|---|---|---|---|---|
x | (初始化) | 0001 | 0111 | 0000 0000 | |
a | 1 | 0001 | 0111 | 0001 0000 | 将被乘数加到积寄存器高4位 |
a | 1 | 0001 | 0111 | 0000 1000 | 将积寄存器右移一位 |
a | 1 | 0001 | 0011 | 0000 1000 | 将乘数寄存器右移一位 |
b | 1 | 0001 | 0011 | 0001 1000 | 将被乘数加到积寄存器高4位 |
b | 1 | 0001 | 0011 | 0000 1100 | 将积寄存器右移一位 |
b | 1 | 0001 | 0001 | 0000 1100 | 将乘数寄存器右移一位 |
c | 1 | 0001 | 0001 | 0001 1100 | 将被乘数加到积寄存器高4位 |
c | 1 | 0001 | 0001 | 0000 1110 | 将积寄存器右移一位 |
c | 1 | 0001 | 0000 | 0000 1110 | 将乘数寄存器右移一位 |
d | 0 | 0001 | 0000 | 0000 0111 | 将积寄存器右移一位 |
d | 0 | 0001 | 0000 | 0000 0111 | 将乘数寄存器右移一位 |
结束 |
3.1.3 乘法器-Version 3
更加高效地借助积寄存器的低32位在运算初始化是全为0而又浪费的情况,将积寄存器的低32位在初始化时作为乘数寄存器。
3.1.4 有符号数运算——布氏算法
运算时遵循表格:
当前位 | 上一位 | 运算操作 |
---|---|---|
1 | 0 | 积做减法 |
0 | 1 | 积做加法 |
1 | 1 | 不做运算,仅移位 |
0 | 0 | 不做运算,仅移位 |
例如2×(−3)=−62 \times(-3) = -62×(−3)=−6,即0010×1101=11110100010 \times 1101 = 111 10100010×1101=1111010:
运算 | 步骤 | 被乘数 | 积 |
---|---|---|---|
0 | 初始化值 | 0010 | 0000 1101 0 |
1 | 1.c:10->积=积-被乘数 | 0010 | 1110 1101 0 |
1 | 2.右移积 | 0010 | 1111 0110 1 |
2 | 1.b:01->积 = 积+被乘数 | 0010 | 0001 0110 1 |
2 | 2.右移积 | 0010 | 0000 1011 0 |
3 | 1.c:10->积=积-被乘数 | 0010 | 1110 1011 0 |
3 | 2.右移积 | 0010 | 1111 0101 1 |
4 | 1.d:11->无运算 | 0010 | 1111 0101 1 |
4 | 2.右移积 | 0010 | 1111 1010 1 |
3.2 除法器
3.2.1 除法器-Version 1
除法器-Version 2
除法器-Version 3
单精度浮点数IEEE
两个比较特殊的浮点数:0和inf的表示方法分别为(以8位为例):
符号位 | 指数位 | 尾数位 | 值 |
---|---|---|---|
0 | 0000 | 000 | 0 |
0 | 1111 | 000 | inf |
计算一个8位的浮点数究竟可以表示多少数字:
步骤 | 个数 |
---|---|
首先一共有8位 | 282^828 |
接下来对于正数而言,在0 1111 000之后的所有值都是无效的,这种无效的数字有 | 23−12^3 - 123−1 |
同上一步有负数的无效数字 | 23−12^3 - 123−1 |
在计算过程中0的表示方式出现了两种:0 0000 000和1 0000 000,要去掉一个 | 1 |
所以说总的可以表示的数字有: | 28−14−1=2412^8 - 14 - 1 = 24128−14−1=241 |
浮点数的加法,尤其是阶数不相同的,以x=0.1101×24,y=0.1011×21x=0.1101\times2^{4},y=0.1011\times2^1x=0.1101×24,y=0.1011×21为例:
步骤 | 值 |
---|---|
将x转化为浮点数 | 0 1010 101 |
将y转化为浮点数 | 0 0111 011 |
将y向x进行对阶 | 0 1010 (0) 001 |
相加 | 0 1010 110 |
则x+y= | 1.11×231.11 \times 2^31.11×23 |
在计算过程中会由于尾数位数的问题造成了部分值的舍弃造成不精确。