文章目录
定点数的表示与运算
1. 定点整数
- ref [1] 2.2
- ref [2] p26
1.1. 补码 x N x N − 1 ⋯ x 0 x_Nx_{N-1}\cdots x_0 xNxN−1⋯x0表示的数 x x x是多大?
有符号整数的
N
+
1
N+1
N+1位二进制补码表达式如下:
X
=
{
∑
n
=
0
N
−
1
x
n
2
n
X
≥
0
−
2
N
+
∑
n
=
0
N
−
1
x
n
2
n
X
<
0
(1)
X=\begin{cases} \sum_{n=0}^{N-1}{x_n2^n}\quad X \geq 0\\ -2^N+\sum_{n=0}^{N-1}{x_n2^n \quad X<0} \end{cases} \tag{1}
X={∑n=0N−1xn2nX≥0−2N+∑n=0N−1xn2nX<0(1)
没有包括符号位
最高位的阶为 N N N
能够表达的范围是 [ − 2 N , 2 N − 1 ] [-2^N,2^N-1] [−2N,2N−1]
1.2. 数 x x x怎么表示为补码
- x ≥ 0 x\geq 0 x≥0时,符号位为0,数字取原码
- x < 0 x<0 x<0时,符号位为1,数字取反码+1
1.3. 二补码与反码的关系
二补码=反码+1
N
N
N位二进制反码
x
N
x
N
−
1
⋯
x
0
x_Nx_{N-1}\cdots x_0
xNxN−1⋯x0表示的数
X
X
X为:
X
=
{
∑
n
=
0
N
−
1
x
n
2
n
X
≥
0
−
2
N
+
1
+
∑
n
=
0
N
−
1
x
n
2
n
X
<
0
(2)
X=\begin{cases} \sum_{n=0}^{N-1}{x_n2^n}\quad X\geq 0\\ -2^N+1+\sum_{n=0}^{N-1}{x_n2^n}\quad X< 0 \end{cases} \tag{2}
X={∑n=0N−1xn2nX≥0−2N+1+∑n=0N−1xn2nX<0(2)
2. 定点小数
2.1. ref [2] p26
若定点小数补码形式为
x
0
.
x
1
x
2
⋯
x
n
x_0.x_1x_2\cdots x_n
x0.x1x2⋯xn,则补码表示的定义是
[
x
]
补
=
{
x
1
>
x
≥
0
2
+
x
=
2
−
∣
x
∣
0
≥
x
>
−
1
(3)
[x]_{补}=\begin{cases} x \quad 1>x\geq 0\\ 2+x=2-|x| \quad 0 \geq x>-1 \end{cases} \tag{3}
[x]补={x1>x≥02+x=2−∣x∣0≥x>−1(3)
2.2. 补码 x 0 . x 1 x 2 ⋯ x N − 1 x_0.x_1x_2\cdots x_{N-1} x0.x1x2⋯xN−1表示的小数 x x x是多大?
最高阶的阶是0
x = { ∑ n = 1 N − 1 x n 2 − n x 0 = 0 − 1 + ∑ n = 1 N − 1 x n 2 − n x 0 = 1 (4) x=\begin{cases} \sum_{n=1}^{N-1}{x_n 2^{-n}} \quad x_0=0\\ -1+\sum_{n=1}^{N-1}{x_n 2^{-n}} \quad x_0=1 \end{cases} \tag{4} x={∑n=1N−1xn2−nx0=0−1+∑n=1N−1xn2−nx0=1(4)
3. 定点数
3.1. 补码 y M ⋯ y 1 y 0 . x 1 x 2 ⋯ x N − 1 y_M\cdots y_1y_0.x_1x_2\cdots x_{N-1} yM⋯y1y0.x1x2⋯xN−1表示的定点数 x x x是多大?
x = { ∑ m = 0 M − 1 y m 2 m + ∑ n = 1 N − 1 x n 2 − n y M = 0 − 2 M + ∑ m = 0 M − 1 y m 2 m + ∑ n = 1 N − 1 x n 2 − n y M = 1 (5) x=\begin{cases} \sum_{m=0}^{M-1}{y_m 2^{m}}+\sum_{n=1}^{N-1}{x_n 2^{-n}} \quad y_M=0\\ -2^M+\sum_{m=0}^{M-1}{y_m 2^{m}}+\sum_{n=1}^{N-1}{x_n 2^{-n}} \quad y_M=1 \end{cases} \tag{5} x={∑m=0M−1ym2m+∑n=1N−1xn2−nyM=0−2M+∑m=0M−1ym2m+∑n=1N−1xn2−nyM=1(5)
4. 补码减法
4.1. 补码加法公式
[ X + Y ] 补 = [ X ] 补 + [ Y ] 补 (51) [X+Y]_补 = [X]_补 + [Y]_补 \tag{51} [X+Y]补=[X]补+[Y]补(51)
4.2. 补码减法公式
[ X − Y ] 补 = [ X ] 补 − [ Y ] 补 = [ X ] 补 + [ − Y ] 补 (52) [X-Y]_补 = [X]_补-[Y]_补 = [X]_补 + [-Y]_补 \tag{52} [X−Y]补=[X]补−[Y]补=[X]补+[−Y]补(52)
[ − Y ] 补 = [ [ Y ] 补 ] 补 (53) [-Y]_补=[[Y]_补]_补 \tag{53} [−Y]补=[[Y]补]补(53)
4.2.1. X = − 1 , Y = 2 , N = 3 X=-1,Y=2,N=3 X=−1,Y=2,N=3,求 X − Y X-Y X−Y
N
=
3
N=3
N=3 能够表达的数的范围:
[
−
2
3
,
2
3
−
1
]
[-2^3,2^3-1]
[−23,23−1]
[
1
]
原
=
001
[1]_原=001
[1]原=001,从而
[
−
1
]
补
=
1111
[-1]_补=1111
[−1]补=1111
[
2
]
补
=
0010
[2]_补=0010
[2]补=0010
[
−
2
]
补
=
1110
[-2]_补=1110
[−2]补=1110
因此,
[
X
−
Y
]
补
=
1111
+
1110
=
1101
[X-Y]_补=1111+1110=1101
[X−Y]补=1111+1110=1101,故
X
−
Y
=
−
3
X-Y=-3
X−Y=−3
5. 两个负数相加
- 不一定会溢出
- 10001 + 10010 = 00011 10001+10010=00011 10001+10010=00011溢出了,首位1后面的数越小,其绝对值越大,相加下溢了
- 11111 + 10001 = 10000 11111+10001=10000 11111+10001=10000没有溢出
6. 溢出处理
6.1. ref [2] p37
两个正数相加,结果大于机器所能表示的最大正数,称为上溢。两个负数相加,结果小于及其所能表示的最小负数,称为下溢。
6.2. 双符号位法
数的变形补码定义为
[
x
]
补
=
{
x
2
>
x
≥
0
4
+
x
0
>
x
≥
−
2
(54)
[x]_补=\begin{cases} x & 2>x\geq0\\ 4+x & 0>x\geq -2 \end{cases} \tag{54}
[x]补={x4+x2>x≥00>x≥−2(54)
下式同样成立
[
x
]
补
+
[
y
]
补
=
[
x
+
y
]
补
(55)
[x]_补+[y]_补=[x+y]_补\tag{55}
[x]补+[y]补=[x+y]补(55)
采用变形补码后,任何小于1的正数,两个符号位都是“0”,任何大于等于-1的负数,两个符号都是“1”. 如果两个数相加后,其结果出现“01”或者“10”两种组合时,表示发生溢出。
7. FixedPointNum
- 加减运算没有考虑溢出,由调用函数确保不会溢出
8. 定点数乘除
8.1. 一个定点数 x x x乘以 2 − j 2^{-j} 2−j
假设
x
x
x的补码表示为
[
x
]
补
=
y
M
⋯
y
1
y
0
.
x
1
x
2
⋯
x
N
−
1
(6)
[x]_补=y_M\cdots y_1y_0.x_1x_2\cdots x_{N-1} \tag{6}
[x]补=yM⋯y1y0.x1x2⋯xN−1(6)
(1)当
y
M
=
0
y_M=0
yM=0时:
[
x
∗
2
−
j
]
补
=
[
x
]
补
≫
j
(61)
[x*2^{-j}]_补=[x]_补\gg j \tag{61}
[x∗2−j]补=[x]补≫j(61)
(2)当
y
M
=
1
y_M=1
yM=1时:
x
x
x的原码为
[ x ] 原 = y M ( y M − 1 ⋯ y 1 y 0 x 1 x 2 ⋯ x N − 1 ‾ + 1 ) (62) [x]_原=y_M(\overline{y_{M-1}\cdots y_1y_0x_1x_2\cdots x_{N-1}} +1)\tag{62} [x]原=yM(yM−1⋯y1y0x1x2⋯xN−1+1)(62)
[ x ∗ 2 − j ] 原 = y M [ ( y M − 1 ⋯ y 1 y 0 x 1 x 2 ⋯ x N − 1 ‾ + 1 ) ≫ j ] (63) [x*2^{-j}]_原=y_M\left[\left(\overline{y_{M-1}\cdots y_1y_0x_1x_2\cdots x_{N-1}} +1\right)\gg j\right ]\tag{63} [x∗2−j]原=yM[(yM−1⋯y1y0x1x2⋯xN−1+1)≫j](63)
[ x ∗ 2 − j ] 补 = y M [ ( y M − 1 ⋯ y 1 y 0 x 1 x 2 ⋯ x N − 1 ‾ + 1 ) ≫ j ‾ + 1 ] (64) [x*2^{-j}]_补=y_M\left[\overline{\left(\overline{y_{M-1}\cdots y_1y_0x_1x_2\cdots x_{N-1}} +1\right)\gg j}+1\right] \tag{64} [x∗2−j]补=yM[(yM−1⋯y1y0x1x2⋯xN−1+1)≫j+1](64)
8.2. 补码乘法1
8.3. 补码乘法2
8.3.1. 补码与真值的转换公式
考虑一个定点补码整数
[
N
]
补
=
a
n
a
n
−
1
⋯
a
1
a
0
[N]_补=a_na_{n-1}\cdots a_1a_0
[N]补=anan−1⋯a1a0,则有
N
=
−
a
n
2
n
+
∑
i
=
0
n
−
1
a
i
2
i
(65)
N=-a_n2^n+\sum_{i=0}^{n-1}{a_i2^i}\tag{65}
N=−an2n+i=0∑n−1ai2i(65)
对于
a
n
=
1
a_n=1
an=1的情况
N
⋅
2
−
j
=
−
2
n
−
j
+
∑
i
=
j
n
−
1
a
i
2
i
−
j
(66)
N\cdot 2^{-j}=-2^{n-j}+\sum_{i=j}^{n-1}{a_i2^{i-j}} \tag{66}
N⋅2−j=−2n−j+i=j∑n−1ai2i−j(66)
所以
[
−
2
n
−
j
]
补
=
[
10
⋯
0
1
n
−
j
+
1
0
⋯
0
]
补
=
[
11
⋯
1
1
n
−
j
+
1
0
⋯
0
]
(67)
\left[ -2^{n-j} \right]_补=\left[10\cdots 0\overset{n-j+1}{1} 0 \cdots 0\right]_补\\ =\left[11\cdots 1\overset{n-j+1}{1} 0 \cdots 0\right] \tag{67}
[−2n−j]补=[10⋯01n−j+10⋯0]补=[11⋯11n−j+10⋯0](67)
[
∑
i
=
j
n
−
1
a
i
2
i
−
j
]
补
=
0
⋯
0
a
n
−
1
n
−
j
⋯
a
j
(68)
\left[ \sum_{i=j}^{n-1}{a_i2^{i-j}} \right]_补=0\cdots 0\overset{n-j}{a_{n-1}}\cdots a_j \tag{68}
[i=j∑n−1ai2i−j]补=0⋯0an−1n−j⋯aj(68)
因此
[
N
⋅
2
−
j
]
补
=
11
⋯
1
1
n
−
j
+
1
a
n
−
1
n
−
j
⋯
a
j
(69)
\left[N\cdot2^{-j}\right]_补=11\cdots1\overset{n-j+1}{1}\overset{n-j}{a_{n-1}}\cdots a_j \tag{69}
[N⋅2−j]补=11⋯11n−j+1an−1n−j⋯aj(69)
8.3.2. 范例: [ N ] 补 = 1100 , j = 1 [N]_补=1100,j=1 [N]补=1100,j=1
[
N
]
原
=
1100
[N]_原=1100
[N]原=1100,从而
N
=
[
−
4
]
10
N=[-4]_{10}
N=[−4]10
−
4
÷
2
=
[
−
2
]
10
=
[
1010
]
原
=
[
1110
]
补
-4\div 2 =[-2]_{10}=[1010]_原=[1110]_补
−4÷2=[−2]10=[1010]原=[1110]补
如果
j
=
2
j=2
j=2
−
4
÷
4
=
[
−
1
]
10
=
[
1001
]
原
=
[
1111
]
补
-4\div 4=[-1]_{10}=[1001]_原=[1111]_补
−4÷4=[−1]10=[1001]原=[1111]补
所以式
(
69
)
(69)
(69)正确
9. 定点数表示的范围
10. 参考文献
[1] 数字信号处理的fpga实现
[2] 计算机组成原理-白中英