一、数的定点表示和浮点表示
定点表示:
小数点固定在某一位置的数为定点数。
浮点表示:
浮点数就是小数点的位置可以浮动的数,例如:
352.47
=
3.5247
×
10
²
=
3524.7
×
10
⁻
¹
=
0.35247
×
10
³
352.47 = 3.5247 × 10²= 3524.7 × 10⁻¹= 0.35247 × 10³
352.47=3.5247×10²=3524.7×10⁻¹=0.35247×10³
这里的小数点位置虽然改变了,但是因为×了不同的10次幂,所有值的大小并没有改变。
通常,浮点数被表示成
N
=
S
×
r
j
N = S×r^j
N=S×rj
公式1
公式中,S为尾数正负都可,r为基数,j为阶码通过小数点的移动来判断。
以基数r=2为例,数N可写成下列不同的形式:
KaTeX parse error: No such environment: align at position 8: \begin{̲a̲l̲i̲g̲n̲}̲ N &= 11.0101\\…
也就是说小数点向左移动x位相当于j为x,小数点向右移动x位,相当于j为-x
浮点数的表示形式:
浮点数在机器中形式如下所示。采用这种数据格式的机器称为浮点机。
浮点数由阶码j和尾数s两部分组成。阶码是整数,阶符和阶码的位数m合起来反映浮点数的表示范围及小数点的实际位置;尾数是小数,其位数n反映了浮点数的精度;尾数的符号s代表符号的正负。
浮点数的表示范围:
以公式1为例,设浮点数阶码的数值取m位,尾数的数值取n位,当浮点数为非规范化数的时候,他的最大正数为$ 2{2m-1}\times(1-2^{-n}) ; 最 小 正 数 为 ;最小正数为 ;最小正数为 2-{2m-1}\times2^{-n} $;最大负数为-的最小正数,最小负数为-的最大正数。
定点数和浮点数的比较
定点数和浮点数可从如下几个方面进行比较
·当浮点机和定点机中数的位数相同时,浮点数的表示范围比定点数的表示范围大得多。
·当浮点数为规范化数时,其相对精度远比定点数高。
·浮点数运算要分阶码部分和尾数部分,而且运算结果都要求规范化,故浮点运算步骤比定点运算步骤多,运算速度比定点运算第,运算线路也复杂。
·在溢出判断上,浮点数是对规格化数的阶码进行判断,而定点数是对数值本身进行判断。
举例
通过这个例子也可以更好地理解浮点机中浮点数的存储方法。阶码中要有一位存符号,所以一共5位(1个阶符+4个数值位),尾数11位(1个数符+10个数值位)。
二、定点运算
移位运算
移位运算对计算机有很大的意义。
移位规则
对于正数,由于正数的原码,补码,反码都等于真值,故移位侯出现的空位均填0。但是对于负数由于原码,补码和反码的表示形式不同,故当机器移位时,对其空位的填补规则也不同。
逻辑移位
逻辑移位的规则是:逻辑左移时,高位移丢,低位添0,逻辑右移时,低位移丢,高位添0。
加法和减法运算
由于减法相当于加上另一个数的相反数,所以把加法和减法放到一起来讨论。
补码加法的基本公式如下:
整
数
:
[
A
]
补
+
[
B
]
补
=
[
A
+
B
]
补
(
m
o
d
2
n
+
1
)
小
数
:
[
A
]
补
+
[
B
]
补
=
[
A
+
B
]
补
(
m
o
d
2
n
)
整数:[A]_补+[B]_补=[A+B]_补(mod 2^{n+1})\\ 小数:[A]_补+[B]_补=[A+B]_补(mod 2^{n})
整数:[A]补+[B]补=[A+B]补(mod2n+1)小数:[A]补+[B]补=[A+B]补(mod2n)
同样可得补码减法运算的基本公式:
整
数
:
[
A
]
补
+
[
−
B
]
补
=
[
A
]
补
+
[
−
B
]
补
(
m
o
d
2
n
+
1
)
小
数
:
[
A
]
补
+
[
−
B
]
补
=
[
A
]
补
+
[
−
b
]
补
(
m
o
d
2
)
整数:[A]_补+[-B]_补=[A]_补+[-B]_补(mod2^{n+1})\\ 小数:[A]_补+[-B]_补=[A]_补+[-b]_补(mod 2)
整数:[A]补+[−B]补=[A]补+[−B]补(mod2n+1)小数:[A]补+[−B]补=[A]补+[−b]补(mod2)
例:
因为取模相当于把最高位的1去掉故$ [A+B]_补=0.0110 $结果正确。
对于最后一个例题还原成真值为118,结果出错,这是因为A-B=138超出了机器字长所能表示范围。在计算机中,这种超出机器字长的现象叫溢出。
溢出判断
1)用一位符号位判断溢出
·对于加法只有在正数+正数,负数+负数的情况下才会溢出,符号不同的两个数相加是不会溢出的。
·对于减法只有在正数-负数,负数-正数的情况下才会溢出,符号相同的两个数相减是不会溢出的。
两操作数均为1,结果符号为0,故为溢出。
结果的符号同原操作数符号,故未溢出。
2)用两位符号为判断溢出
2位符号位的补码,即变形补码,它是以4为模的,其定义为:
[
x
]
补
=
{
x
,
1
>
x
≥
0
4
+
x
,
0
>
x
≥
−
1
(
m
o
d
4
)
}
[x]_补= \left. \begin{cases} x,1>x\ge0\\ 4+x,0>x\ge-1(mod4) \end{cases} \right\}
[x]补={x,1>x≥04+x,0>x≥−1(mod4)}
在用变形补码作加法时,2位符号位要连同数值部分一起参加运算,而且高位符号位产生的进位自动丢失,便可以得到正确结果,即
[
x
]
补
’
+
[
y
]
补
′
=
[
x
+
y
]
补
′
(
m
o
d
4
)
[x]_{补’}+[y]_{补'}=[x+y]_{补'}(mod4)
[x]补’+[y]补′=[x+y]补′(mod4)
变形补码判断溢出的原则是:当2位符号位不同时,表示溢出,否则;无溢出。不论是否发生溢出,高位(第一位)符号位永远代表真正的符号。
最后结果两个符号位相同所以没有溢出
这个就是溢出的情况。
乘法运算
首先先归纳一下乘法运算的过程:
1)乘法运算可用移位和加法来实现,两个四位数相乘,总共需要进行四次加法运算和四次移位。
2)由乘数的末位值确定被乘数是否与原部分积相加,然后右移移位,形成新的部分积;同时,乘数也右移一位,由此低位作新的末位,空出最高位放部分积和最低为。
3)每次做加法时,被乘数仅仅与原部分积的最高位相加,其低位被移至乘数所空出的高位位置。
计算机很容易实现这种运算规则。用一个寄存器存放被乘数,一个寄存器存放乘积的高位,另一个寄存器存放乘数及乘积的低位,再配上加法器及其他响应电路,就可组成乘法器。又因加法只在部分积的高位进行,故不但节省了器材,而且还缩短了运算时间。
接下来一个例题:
乘数A=0.1101,乘数B=0.1011
$ A\times B= $
总结一下就是:把新的部分积和乘数放到同一行,除了第一次之外,以后每一次都部分积连同乘数向右移一位,然后看乘数最后一位,如果最后一位为1,那部分积就加乘数A,否则就加0.
原码乘法:
由于原码表示与真值极为相识,只差一个符号,而乘积的符号又可通过两数符号的逻辑异或求得,因此,上述讨论得结果可以直接用于原码一位乘,只需加上符号位处理即可。
1)原码一位乘运算规则
以小数为例:
设
[
x
]
原
=
x
0
.
x
1
x
2
.
.
.
x
n
[
y
]
原
=
y
0
.
y
1
y
2
.
.
.
y
n
[x]_原=x_0.x_1x_2...x_n\\ [y]_原=y_0.y_1y_2...y_n
[x]原=x0.x1x2...xn[y]原=y0.y1y2...yn
则$ [x]_原\times [y]_原=x_0\oplus y_0.(0.x_1x_2…x_n)(0.y_1y_2…y_n) $
式中,$ 0.x_1x_2…x_n 为 x 的 绝 对 值 , 记 作 为x的绝对值,记作 为x的绝对值,记作 x^* ; ; ; 0.y_1y_2…y_n 为 y 的 绝 对 值 , 记 作 为y的绝对值,记作 为y的绝对值,记作 y^* $。
原码两位乘
为了提高乘法速度,可采用原码两位乘。
(暂时未学会┭┮﹏┭┮)
除法运算
1)恢复余数法
恢复余数法的特点是:当余数为负时,需加上除数,将其恢复成原来的余数。
由上所述,商值的确定时通过比较被除数和除数的绝对值大小,即$ [x*]_补+[y*]_补 $的操作。
简单总结一下就是,在求商数之前,先用$ [x*]_补-[y]_补 的 正 负 来 判 断 这 俩 的 大 小 关 系 , 若 x > y 则 上 商 为 1 否 则 上 商 为 0 , 然 后 再 恢 复 余 数 即 的正负来判断这俩的大小关系,若x>y则上商为1否则上商为0,然后再恢复余数即 的正负来判断这俩的大小关系,若x>y则上商为1否则上商为0,然后再恢复余数即 +[y^]_补 $。
例题:
2)加减交替法
对于余数交替法来说可总结以下两点:
·当$ R_i>0 商 为 ” 1 “ , 做 商为”1“,做 商为”1“,做 2R_i-y^* $的运算
·当$ R_i<0 商 为 ” 0 “ , 做 商为”0“,做 商为”0“,做 2R_i+y^* $的运算
所以这里已经看不出恢复余数的问题了。
例题:
补码除法
相比于原码除法来说,补码除法要解决三个问题
(1)如何确定商值
(2)如何形成商符
(3)如何获得新的余数
首先要想确定商值就必须比较被除数和除数之间的大小关系。
比较$ [x]_补与[y]_补 $的符号 | 求余数 | 比较$ [R_i]_补与[y]_补 $的符号 |
---|---|---|
同号 | [ x ] 补 − [ y ] 补 [x]_补-[y]_补 [x]补−[y]补 | 同号,表示”够减“ |
异号 | [ x ] 补 + [ y ] 补 [x]_补+[y]_补 [x]补+[y]补 | 异号,表示”够减“ |
·商值的确定总的来说就是够减上商为”1“不够减上商为”0“
[ R ] 补 与 [ y ] 补 [R]_补与[y]_补 [R]补与[y]补 | 商值 |
---|---|
同号 | 1 |
异号 | 0 |
同时在补码除法中,商符是在求商的过程中自动形成的。
[ R ] 补 与 [ y ] 补 [R]_补与[y]_补 [R]补与[y]补 | 商值 | 新余数 [ R i + 1 ] 补 [R_{i+1}]_补 [Ri+1]补 |
---|---|---|
同号 | 1 | [ R i + 1 ] 补 = 2 [ R i ] 补 + [ − y ] 补 [R_{i+1}]_补=2[R_i]_补+[-y]_补 [Ri+1]补=2[Ri]补+[−y]补 |
异号 | 0 | [ R i + 1 ] 补 = 2 [ R i ] 补 + [ y ] 补 [R_{i+1}]_补=2[R_i]_补+[y]_补 [Ri+1]补=2[Ri]补+[y]补 |
例题:
如果对精度没有特殊要求,一般采用”末位恒置1“的方法,这种方法操作简单,易于实现,而且最大误差仅仅有$ 2^{-n} $。
同时当 [ x ] 补 与 [ y ] 补 [x]_补与[y]_补 [x]补与[y]补同号的时候 + [ − y ] 补 +[-y]_补 +[−y]补得到余数。异号时 + [ y ] 补 +[y]_补 +[y]补得到余数。
到此定点运算结束。
| 0 |
[
R
i
+
1
]
补
=
2
[
R
i
]
补
+
[
y
]
补
[R_{i+1}]_补=2[R_i]_补+[y]_补
[Ri+1]补=2[Ri]补+[y]补 |
例题:
[外链图片转存中…(img-jlLFwaXY-1668601584254)]
[外链图片转存中…(img-ufXVi1MG-1668601584254)]
如果对精度没有特殊要求,一般采用”末位恒置1“的方法,这种方法操作简单,易于实现,而且最大误差仅仅有$ 2^{-n} $。
同时当 [ x ] 补 与 [ y ] 补 [x]_补与[y]_补 [x]补与[y]补同号的时候 + [ − y ] 补 +[-y]_补 +[−y]补得到余数。异号时 + [ y ] 补 +[y]_补 +[y]补得到余数。
到此定点运算结束。