数的定点表示和浮点表示

一、数的定点表示和浮点表示

定点表示:

小数点固定在某一位置的数为定点数。

浮点表示:

浮点数就是小数点的位置可以浮动的数,例如:
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} $;最大负数为-的最小正数,最小负数为-的最大正数。

定点数和浮点数的比较

定点数和浮点数可从如下几个方面进行比较

·当浮点机和定点机中数的位数相同时,浮点数的表示范围比定点数的表示范围大得多。

·当浮点数为规范化数时,其相对精度远比定点数高。

·浮点数运算要分阶码部分和尾数部分,而且运算结果都要求规范化,故浮点运算步骤比定点运算步骤多,运算速度比定点运算第,运算线路也复杂。

·在溢出判断上,浮点数是对规格化数的阶码进行判断,而定点数是对数值本身进行判断。

举例

image-20221115151110772

通过这个例子也可以更好地理解浮点机中浮点数的存储方法。阶码中要有一位存符号,所以一共5位(1个阶符+4个数值位),尾数11位(1个数符+10个数值位)。

二、定点运算

移位运算

移位运算对计算机有很大的意义。

移位规则

对于正数,由于正数的原码,补码,反码都等于真值,故移位侯出现的空位均填0。但是对于负数由于原码,补码和反码的表示形式不同,故当机器移位时,对其空位的填补规则也不同。

image-20221115151726230

逻辑移位

逻辑移位的规则是:逻辑左移时,高位移丢,低位添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
例:

image-20221115153051347

因为取模相当于把最高位的1去掉故$ [A+B]_补=0.0110 $结果正确。

image-20221115153230967

对于最后一个例题还原成真值为118,结果出错,这是因为A-B=138超出了机器字长所能表示范围。在计算机中,这种超出机器字长的现象叫溢出。

溢出判断

1)用一位符号位判断溢出

​ ·对于加法只有在正数+正数,负数+负数的情况下才会溢出,符号不同的两个数相加是不会溢出的。

​ ·对于减法只有在正数-负数,负数-正数的情况下才会溢出,符号相同的两个数相减是不会溢出的。

image-20221115185849895

两操作数均为1,结果符号为0,故为溢出。

image-20221115190051732

结果的符号同原操作数符号,故未溢出。

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>x04+x,0>x1(mod4)}
在用变形补码作加法时,2位符号位要连同数值部分一起参加运算,而且高位符号位产生的进位自动丢失,便可以得到正确结果,即
[ x ] 补 ’ + [ y ] 补 ′ = [ x + y ] 补 ′ ( m o d 4 ) [x]_{补’}+[y]_{补'}=[x+y]_{补'}(mod4) [x]+[y]=[x+y](mod4)
变形补码判断溢出的原则是:当2位符号位不同时,表示溢出,否则;无溢出。不论是否发生溢出,高位(第一位)符号位永远代表真正的符号。

image-20221115191427785

最后结果两个符号位相同所以没有溢出

image-20221115191454121

这个就是溢出的情况。

乘法运算

首先先归纳一下乘法运算的过程:

1)乘法运算可用移位和加法来实现,两个四位数相乘,总共需要进行四次加法运算和四次移位。

2)由乘数的末位值确定被乘数是否与原部分积相加,然后右移移位,形成新的部分积;同时,乘数也右移一位,由此低位作新的末位,空出最高位放部分积和最低为。

3)每次做加法时,被乘数仅仅与原部分积的最高位相加,其低位被移至乘数所空出的高位位置。

​ 计算机很容易实现这种运算规则。用一个寄存器存放被乘数,一个寄存器存放乘积的高位,另一个寄存器存放乘数及乘积的低位,再配上加法器及其他响应电路,就可组成乘法器。又因加法只在部分积的高位进行,故不但节省了器材,而且还缩短了运算时间。

接下来一个例题:

image-20221115192428792

乘数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^* $。

image-20221115193737481

image-20221115193759824

原码两位乘

为了提高乘法速度,可采用原码两位乘。

(暂时未学会┭┮﹏┭┮)

除法运算

1)恢复余数法

恢复余数法的特点是:当余数为负时,需加上除数,将其恢复成原来的余数。

由上所述,商值的确定时通过比较被除数和除数的绝对值大小,即$ [x*]_补+[y*]_补 $的操作。

简单总结一下就是,在求商数之前,先用$ [x*]_补-[y]_补 的 正 负 来 判 断 这 俩 的 大 小 关 系 , 若 x > y 则 上 商 为 1 否 则 上 商 为 0 , 然 后 再 恢 复 余 数 即 的正负来判断这俩的大小关系,若x>y则上商为1否则上商为0,然后再恢复余数即 x>y10 +[y^]_补 $。

例题:

image-20221116200037633

image-20221116200047705

2)加减交替法

对于余数交替法来说可总结以下两点:

·当$ R_i>0 商 为 ” 1 “ , 做 商为”1“,做 1 2R_i-y^* $的运算

·当$ R_i<0 商 为 ” 0 “ , 做 商为”0“,做 0 2R_i+y^* $的运算

所以这里已经看不出恢复余数的问题了。

例题:

image-20221116200645916

image-20221116200654689

补码除法

相比于原码除法来说,补码除法要解决三个问题

(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]

例题:

image-20221116202013913

image-20221116202028597

如果对精度没有特殊要求,一般采用”末位恒置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]得到余数。

到此定点运算结束。

  • 4
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

天热写代码不吹空调

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值