定点数的表示与运算


定点数的表示与运算

1. 定点整数

  • ref [1] 2.2
  • ref [2] p26

1.1. 补码 x N x N − 1 ⋯ x 0 x_Nx_{N-1}\cdots x_0 xNxN1x0表示的数 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=0N1xn2nX02N+n=0N1xn2nX<0(1)

没有包括符号位

最高位的阶为 N N N

能够表达的范围是 [ − 2 N , 2 N − 1 ] [-2^N,2^N-1] [2N,2N1]

1.2. 数 x x x怎么表示为补码

  • x ≥ 0 x\geq 0 x0时,符号位为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 xNxN1x0表示的数 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=0N1xn2nX02N+1+n=0N1xn2nX<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.x1x2xn,则补码表示的定义是
[ 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>x02+x=2x0x>1(3)

2.2. 补码 x 0 . x 1 x 2 ⋯ x N − 1 x_0.x_1x_2\cdots x_{N-1} x0.x1x2xN1表示的小数 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=1N1xn2nx0=01+n=1N1xn2nx0=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} yMy1y0.x1x2xN1表示的定点数 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=0M1ym2m+n=1N1xn2nyM=02M+m=0M1ym2m+n=1N1xn2nyM=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} [XY]=[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 XY

N = 3 N=3 N=3 能够表达的数的范围: [ − 2 3 , 2 3 − 1 ] [-2^3,2^3-1] [23,231]
[ 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 [XY]=1111+1110=1101,故 X − Y = − 3 X-Y=-3 XY=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>x00>x2(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} 2j

假设 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]=yMy1y0.x1x2xN1(6)
(1)当 y M = 0 y_M=0 yM=0时:
[ x ∗ 2 − j ] 补 = [ x ] 补 ≫ j (61) [x*2^{-j}]_补=[x]_补\gg j \tag{61} [x2j]=[x]j(61)
(2)当 y M = 1 y_M=1 yM=时:
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(yM1y1y0x1x2xN1+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} [x2j]=yM[(yM1y1y0x1x2xN1+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} [x2j]=yM[(yM1y1y0x1x2xN1+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]=anan1a1a0,则有
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=0n1ai2i(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} N2j=2nj+i=jn1ai2ij(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} [2nj]=[1001nj+100]=[1111nj+100](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=jn1ai2ij]=00an1njaj(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} [N2j]=1111nj+1an1njaj(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] 计算机组成原理-白中英

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值