随着数字信号处理和嵌入式系统的发展,定点数运算在各类应用中逐渐展现出其重要性。相比浮点数运算,定点数运算以其更高的效率和更低的存储需求在实时计算和数据处理领域占据了不可或缺的地位。
一、定点数的基本概念
定点数是按固定小数点位置表示的一种数值表达方式。与浮点数不同,定点数的值是基于数值的整数部分和小数部分的和,通过固定的小数点位置来表示,这使得定点数运算在硬件实现上更加简单。
定点数通常利用不同的位数表示数值,主要包括:
- 原码表示:直接在二进制中表示数值,其中最高位表示符号(0为正,1为负)。
- 补码表示:负数以其绝对值的补码形式存储,便于计算机进行算数运算。使用补码能避免运算时出现模糊不清的负值处理。
- 符号定点数:规定符号位和数值位的分布,通常适用于需要考虑符号的应用。
例如,16位定点数可以表述为:1位符号位 + 7位整数部分 + 8位小数部分,表示的范围是-128到127.99609375。这种格式不仅可以直接表示整数,也能满足对小数的基本需求。
二、定点数运算的基本原理
定点数的运算主要包括加法、减法、乘法和除法。以下对这些基本运算进行详细说明。
1. 加法
定点数加法的基本过程可以概括如下:
- 对齐操作:为保证两数相加的精确性,首先需要将小数部分对齐。如果两个定点数的小数部分位数不相同,需要进行补零处理。
- 运算:使用标准的二进制加法规则进行相加。若发生进位,还需将进位加到更高位上。
- 溢出检查:若运算结果超出定点数表示范围(例如,当结果在整数部分超出范围),则需进行溢出处理。通常会设置一个溢出标志位,指示哪个状态发生了溢出。
加法公式
对于定点数的加法,给定两个定点数 A 和 B,运算可以表示为:[ C = A + B ]
例题 1:定点加法
题目:假设有以下两个定点数:
- A = 0101.1100 (二进制,表示 5.75)
- B = 0011.0011 (二进制,表示 3.1875)
请计算 A + B 的结果。
解答:
- 对齐小数点(位数已经对齐)。
- 进行二进制加法:
0101.1100
+ 0011.0011
-------------
1001.1111
- 结果 C = 1001.1111 (二进制),转换为十进制为:
[ C = 1 \times 2^3 + 0 \times 2^2 + 0 \times 2^1 + 1 \times 2^0 + 1 \times 2^{-1} + 1 \times 2^{-2} + 1 \times 2^{-3} = 8 + 0 + 0 + 1 + 0.5 + 0.25 + 0.125 = 9.9375 ]
结果:A + B = 1001.1111(二进制),即 9.9375(十进制)。
例题 2:定点加法
题目:假设有以下两个定点数:
- A = 0010.1010 (二进制,表示 2.625)
- B = 0001.0110 (二进制,表示 1.375)
请计算 A + B 的结果。
解答:
- 对齐小数点(位数已经对齐)。
- 进行二进制加法:
0010.1010
+ 0001.0110
-------------
0011.1000
- 结果 C = 0011.1000 (二进制),转换为十进制为:
[ C = 0 \times 2^3 + 0 \times 2^2 + 1 \times 2^1 + 1 \times 2^0 + 1 \times 2^{-1} + 0 \times 2^{-2} + 0 \times 2^{-3} = 0 + 0 + 2 + 1 + 0.5 + 0 + 0 = 3.5 ]
结果:A + B = 0011.1000(反向),即 3.5(十进制)。
2. 减法
减法实际上可以转换为加法,具体步骤如下:
- 取反加一:将被减数取补码(即~B + 1形成补数),然后与减数A进行相加。
- 相同的溢出检查:和加法一样,减法同样会面临溢出问题。
减法公式
对于定点数的减法,给定两个定点数 A 和 B,减法运算可以表示为:[ C = A - B ]
例题 3:定点减法
题目:假设有以下两个定点数:
- A = 1100.1010 (二进制,表示 -3.375,采用补码表示法)
- B = 0010.0110 (二进制,表示 2.375)
请计算 A - B 的结果。
解答:
- 稍作注意,A 是负数,采用补码表示。
- 先计算 B 的补码以进行减法。 B 的补码为:
取反:0010.0110 → 1101.1001
加一:1101.1001 + 1 = 1101.1010
- 计算 A - B 实际上为 A + (-B):
1100.1010
+ 1101.1010
-------------
1 1010.0100
这里出现了溢出位(1),则只看结果 1010.0100。
- 把得到的结果转换为十进制:
[ C = -2^3 + 0 + 1 \times 2^1 + 0 \times 2^0 + 1 \times 2^{-1} + 0 \times 2^{-2} + 0 \times 2^{-3} = -8 + 0 + 2 + 0 + 0.5 + 0 + 0 = -5.5 ]
结果:A - B = 1010.0100(反向),即 -5.5(十进制)。
例题 4:定点减法
题目:假设有以下两个定点数:
- A = 0011.1000 (二进制,表示 3.5)
- B = 0001.0100 (二进制,表示 1.25)
请计算 A - B 的结果。
解答:
- 对齐小数点(位数已经对齐)。
- 通过 B 取补,然后进行减法。B 的原码为:
B = 1.25的补码运算
- 原码:0001.0100
- 取反:1110.1011
- 加一:1110.1011 + 0000.0001 = 1110.1100
- 计算 A - B:
0011.1000
+ 1110.1100
-------------
1 0010.0100
去掉溢出位,结果为 0010.0100。
- 转换为十进制:
[ C = 2 \times 2^1 + 1 \times 2^0 + 0 \times 2^{-1} + 1 \times 2^{-2} = 2 + 0 + 0.25 = 2.25 ]
结果:A - B = 0010.0100(反向),即 2.25(十进制)。
3. 乘法
乘法的过程相对复杂,通常包括以下步骤:
- 运算:定点数乘法可以看作二进制形式的逐位乘法运算,类似经典的笔算乘法。
- 移位处理:乘法结果通常需要比输入数位数多,因此在计算后需要根据小数部分的位数进行适当的右移,以调整小数点位置。
- 溢出管理:由于乘法结果可能会大于表示范围,因此需要进行溢出处理。
乘法公式
对于两个定点数 A 和 B,定点数乘法的计算可以表示为:[ C = A \times B ]
例题 1:定点乘法
题目:假设有以下两个定点数:
- A = 0011.0100 (二进制,表示 3.25)
- B = 0001.1001 (二进制,表示 1.5625)
请计算 A × B 的结果。
解答:
- 将 A 和 B 转换到十进制进行验证(可选)。
- 逐位相乘,记录部分积:
0011.0100
× 0001.1001
----------------
0011.0100 (A × 1)
+ 0000.0000 (A × 0)
+ 0011.0100 (A × 1,左移一位)
+ 0000.0000 (A × 0,左移两位)
+ 0011.0100 (A × 1,左移三位)
----------------
0000 0000 0000 0110 1100(这里留下进位)
- 汇总所有部分积并对齐小数点:
0000 0011.0100
+ 0000 0000.0000
+ 0000 0110.1000
+ 0000 0000.0000
+ 0011 0100.0000
---------------------
0000 0100.0000 0000 (注意小数点位置和有效位数)
- 小数点位置调整:因为 A 和 B 各有 4 位小数,最终结果有 8 位小数。
- 根据计算,结果为:0011.111100,2.5625。
结果:A × B = 0001.11100100(二进制),即5.078125(十进制)。
例题 2:定点乘法
题目:假设有以下两个定点数:
- A = 0100.1100 (二进制,表示 4.75)
- B = 0010.0001 (二进制,表示 2.0625)
请计算 A × B 的结果。
解答:
- 逐位相乘,记录部分积:
0100.1100
× 0010.0001
----------------
0100.1100 (A × 1)
+ 0000.0000 (A × 0)
+ 0000.0000 (A × 0,左移一位)
+ 0100.1100 (A × 1,左移两位)
----------------
0000 0000 0101 0110 0000(这里留下进位)
- 汇总所有部分积:
0000 0000.0000 (来自第0行)
+ 0000 0000.0000 (来自第1行)
+ 0000 0000.0000 (来自第2行)
+ 0100 1100.0000 (来自第3行)
---------------------
0001 0001.1010
- 小数点位置调整,根据 A 和 B 各有 4 位小数,最终结果应有 8 位小数。
- 结果为 1001.1000100,即 9.8046875。
结果:A × B = 0001.10011000(二进制),即 9.8046875(十进制)。
4. 除法
定点数除法通常会比其他运算复杂,主要流程如下:
- 分析运算:除法可以转化为乘法,因此可以通过计算B的倒数(1/B)来间接实现。
- 精度控制:除法通常会引入更多的精度问题,尤其是结果的舍入可能会导致不同的数值误差。因此,电路设计中需要考虑到精度调整措施。
除法公式
对于两个定点数 A 和 B,定点数除法的计算可以表示为:[ C = A ÷ B ]
例题 3:定点除法
题目:假设有以下两个定点数:
- A = 0100.1000 (二进制,表示 4.5)
- B = 0001.0100 (二进制,表示 1.25)
请计算 A ÷ B 的结果。
解答:
- 首先计算 B 的倒数。利用近似法,对于 1.25 的倒数可以用数值方法,约为 0.8(可以设为 0.1100)。
- 进行乘法运算:
0100.1000
× 0000.1100
---------------------
(计算过程类似乘法)
- 计算结果应为:
- 方案为 0110.0000 (算作 3.25),得到小数点位置调整为 1 位,最终小数位置调整。
- 结果为 0001.0110(二进制),即 3.6。
结果:A ÷ B = 0011.1000(二进制),即 3.6(十进制)。
例题 4:定点除法
题目:假设有以下两个定点数:
- A = 0111.0000 (二进制,表示 7.0)
- B = 0001.1000 (二进制,表示 1.5)
请计算 A ÷ B 的结果。
解答:
- 首先计算 B 的倒数。 1/1.5 = 0.6666,近似值可以用数值法计算,转换为二进制约为 0.1010。
- 进行乘法运算:
0111.0000
× 0000.1010
---------------------
(与先前的乘法类似)
- 汇总部分积,结果大约为:
- 0110.0000(二进制),对应 4.6667,经过小数位调整。
- 结果为 0010.1101(二进制),即 4.6667。
结果:A ÷ B = 0010.1101(二进制),即 4.6667(十进制)。
三、定点数运算电路设计
1、四位串行加法器的设计(基于一位全加器FA)
2、四位串行加/减法器设计
3、带溢出检测功能的加/减运算器
4、带无符号数溢出检测功能的加/减运算器
5、串行进位
6、并行进位(先行进位)
7、4位并行进位运算器
如有表述错误及欠缺之处敬请批评指正。
【参考文献】
《计算机组成原理》,唐朔飞
部分图例借鉴来源:https://www.cnblogs.com/fate-/p/12728700.html