计组_浮点数表示/补码运算:定点数加减法/浮点数加减法(步骤+实例)「建议收藏」

计组_浮点数表示/补码运算:定点数加减法/浮点数加减法(步骤+实例)「建议收藏」文章目录步骤问题实例对阶操作(基于补码)尾数求和(基于对阶后)规格化数相关知识左归操作右归操作回到本例:步骤设两个浮点数x=Sx⋅rjxy=Sy⋅rjy\begin{array}{l}x=S_{x}\cdotr^{j_{x}}\\y=S_{y}\cdotr^{j_{y}}\end{array}x=Sx​⋅rjx​y=Sy​⋅rjy​​(1)对阶,使两数的小数点位置对齐。(2)尾数求和,将对阶后的两尾数按定点加减运算规则求和(差)(3)规格化,为增加有效数字的位数,提高运

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

浮点数表示/补码运算:定点数加减法/浮点数加减法

浮点数表示

  • 浮点数表示法是指以适当的形式将比例因子表示在数据中,让小数点的位置根据需要而浮动。
  • 这样,在位数有限的情况下,既扩大了数的表示范围,又保持了数的有效精度
    • 例如,用定点数表示电子的质量或太阳的质量是非常不方便的。
    • 使用浮点是可以较好表示

IEEE 754标准的浮点数格式

1646287126006

计组_浮点数表示/补码运算:定点数加减法/浮点数加减法(步骤+实例)「建议收藏」

其中,S为数符,它表示浮点数的正负,但与其有效位(尾数)是分开的。

阶码用移码表示,阶码的真值都被加上一个常数(偏移量),

  • 如短实数,长实数和临时实数的偏移量用十六进制数表示分别为7FH,3FFH和3FFFH。
  • 尾数部分通常都是规格化表示,即非“O”的有效位最高位总是“1”,但在IEEE标准中,有效位呈如下形式。
    1▲ffff……-fff
    其中▲表示假想的二进制小数点。
  • 在实际表示中,对短实数和长实数,这个整数位的1省略,称隐藏位;
  • 对于临时实数不采用隐藏位方案,
  • 下表列出了十进制数178.125的实数表示。
    • 计组_浮点数表示/补码运算:定点数加减法/浮点数加减法(步骤+实例)「建议收藏」

非标准形式讨论浮点数

通常,浮点数被表示成
N = S × r j N =S \times r^{j} N=S×rj
式中,

  • S为尾数(可正可负),
  • j为阶码(可正可负),
  • r是基数(或基值)。

在计算机中,基数可取2,4、8或16等。

  • 为了提高数据精度以及便于浮点数的比较,在计算机中规定浮点数的尾数纯小数形式,
  • 此外,将尾数(小数)最高位为1的浮点数称为规格化数,即 N = 0.110101 × 2 100 N =0. 110101\times 2^{100} N=0.110101×2100为浮点数的规格化形式(100为4的二进制形式)。
  • 浮点数表示成规格化形式后,其精度最高

1646288069544

  • 浮点数由阶码j和尾数S两部分组成。
    • 阶码是整数,阶符 j f j_{f} jf阶码的位数m合起来反映浮点数的表示范围及小数点的实际位置;
    • 尾数是小数,其位数n反映了浮点数的精度;
    • 尾数的符号 S f S_{f} Sf代表浮点数的正负

浮点数形式分析

分段:阶数;尾数

具体展开为:阶数:{(阶符),(阶码数值)};尾数:{(数符).(数码数值)} 的书写形式(即尾数分为数符和数码)
基数是默认值为2,可以不体现出来
阶符数符可以取0/1

浮点数的表示范围(非规格化时)

设浮点数阶码的数值位取m位,尾数的数值位取n位,当浮点数为非规格化数时,它在数轴上的表示范围:

1646303050232

浮 点 数 = 阶 数 × 尾 数 浮点数=阶数\times 尾数 =×

浮点数的精度和范围

一旦浮点数的位数确定后,合理分配阶码尾数位数,直接影响浮点数的表示范围和精度

  • 通常对于短实数(总位数为32位),阶码取8位(含阶符1位) ,尾数取24位(含数符1位);
  • 对于长实数(总位数为64位),阶码取11位(含阶符1位) ,尾数取53位(含数符1位);
  • 对于临时实数(总位数为80位),阶码取15位(含阶符1位) ,尾数取65位(含数符1位)。

浮点数的规格化

  • 为了提高浮点数的精度,其尾数必须为规格化数。
  • 如果不是规格化数,就要通过修改阶码同时左右移尾数的办法,使其变成规格化数。
  • 将非规格化数转换成规格化数的过程称为规格化。
    • 对于基数不同的浮点数,因其规格化数的形式不同,规格化过程也不同

左规/右规

  • 当基数为2时,尾数最高位为1的数为规格化数。

    • 规格化数的尾数的绝对值不小于 1 2 \frac{1}{2} 21
    • 规格化时,尾数左移一位,阶码减1(这种规格化称为向左规格化,简称左规);
    • 尾数右移一位,阶码加1(这种规格化称为向右规格化,简称右规)。
  • 当基数为4时,尾数的最高两位不全为零的数为规格化数。

    • 规格化时,尾数左移两位,阶码减1 ;
    • 尾数右移两位,阶码加1。
  • 当基数为8时,尾数的最高三位不全为零的数为规格化数。

    • 规格化时,尾数左移三位,阶码减1;
    • 尾数右移三位,阶码加1。
  • 浮点机中一旦基数确定后就不再变了
  • 而且基数是隐含的,故不同基数的浮点数表示形式完全相同。
    • 但基数不同,对数的表示范围和精度等都有影响。
    • 一般来说,基数r越大,可表示的浮点数范围越大,而且所表示的数的个数越多。
    • 但r越大,浮点数的精度反而下降。
    • 如r = 16的浮点数,因其规格化数的尾数最高三位可能出现零,故与其尾数位数相同的r =2的浮点数相比,后者可能比前者多三位精度。

双符号位规格化

1646382660768

可见,当尾数的最高数值位与符号位不同时,即为规格化形式

但对S<0时,有两种情况需特殊处理。

  • s = − 1 2 s=-\frac{1}{2} s=21,则 [ S ] 补 = 11.100 ⋯ 0 , [S]_{补}=11.100\cdots 0, [S]=11.1000,
    此时对于真值 − 1 2 -\frac{1}{2} 21,而言,它满足式(6.19),对于补码 [ S ] 补 [S]_{补} [S],而言,不满足6.21的形式

为了便于硬件判断,特规定 − 1 2 -\frac{1}{2} 21不是规格化的数(对补码而言)。

  • s = − 1 s = -1 s=1,则 [ S ] 补 = 11.00 … 0 [S]_{补} = 11.00…0 [S]=11.000,因小数补码允许表示-1,故-1视为规格化的数。

左规

例子

1646383455850

右规

  • 当尾数出现01.x x…×或10.x x…x时,表示尾数溢出,这在定点加减运算中是不允许的,
  • 但在浮点运算中这不算溢出,可通过右规处理
  • 右规时尾数右移一位,阶码加1。

机器零

  • 当一个浮点数尾数为0时(不论其阶码为何值)或阶码等于或小于它所能表示的最小数时(不管其尾数为何值)机器都把该浮点数作为零看待,并称之为“机器零”。
  • 如果浮点数的阶码用移码表示,尾数用补码表示
    • 则当阶码为它所能表示的最小数 − 2 m -2^{m} 2m(式中 m为阶码的位数,此时该浮点数已经被当作机器零)且尾数为0时,其阶码(移码)全为0,尾数(补码)也全为0,这样的机器零为000…0000

移码

使用补码不容易直接判断数的大小
使用移码可以直接判断出机器数对应的真值之间的大小关系
[ x ] 移 [x]_{移} [x]在数轴上的表示总是>=0
计组_浮点数表示/补码运算:定点数加减法/浮点数加减法(步骤+实例)「建议收藏」

计组_浮点数表示/补码运算:定点数加减法/浮点数加减法(步骤+实例)「建议收藏」

  • 此外,由移码的定义可见,当n = 5时,其最小的真值为 x = − 2 5 = − 10000 0 二 进 制 x = -2^{5}=- 100000_{二进制} x=25=100000,则 [ − 100000 ] 移 = 2 5 + x = 100000 − 100000 = 0 , 00000 [ – 100000]_{移} =2^{5}+ x = 100000 – 100000 = 0,00000 [100000]=25+x=100000100000=0,00000,即最小真值的移码为全0,这符合人们的习惯。
  • 利用移码的这一特点,当浮点数的阶码用移码表示时,就能很方便地判断阶码的大小

加法/减法运算

加法/减法可能会产生溢出,因此还伴随着溢出判断等处理

定点数加法/减法运算

补码加法公式

计组_浮点数表示/补码运算:定点数加减法/浮点数加减法(步骤+实例)「建议收藏」

补码减法公式

计组_浮点数表示/补码运算:定点数加减法/浮点数加减法(步骤+实例)「建议收藏」

  • 因此,若机器数采用补码,当求A – B时,只需先求 [ − B ] 补 [ -B]_{补} [B](称 [ – B ] 补 [ –B]_{补} [B],为“求补”后的减数),就可按补码加法规则进行运算。
  • [ − B ] 补 [ -B]_{补} [B] [ B ] 补 [B]_{补} [B]连同符号位在内,每位取反,末位加1而得
    • (由于B可以是正数也可以是负数)。
    • B和-B在的原码(真值)的二进制形式上仅相差一个符号位
    • 例如, B = − 6 = 1 , 110 ; − B = 6 = 0 , 110 ; B=-6=1,110;-B=6=0,110; B=6=1,110;B=6=0,110;
      • [ − B ] 补 = [ 6 ] 补 = 0 , 110 ; [-B]_{补}=[6]_{补}=0,110; [B]=[6]=0,110;
      • [ B ] 补 = [ − 6 ] 补 = 1 , 010 ; [B]_{补}=[-6]_{补}=1,010; [B]=[6]=1,010;
      • 求(一个数的)相反数的补数(码):数B的相反数的补数(即-B的补数)确实可以通过将B的补码包括符号位在内的所有位取反再末尾+1得到.
        • 即,采取的策略是用一个补码求另一个补码
      • 事实上(上述规律的一个具体情况),求一个负数的补码,也可以通过求其相反数的补码的手法来得到(比如-6的补码,通过将其相反数+6补码的所有位取反再末尾+1得到;(可以将这种情况视为求相反数的补码的特例)
        • 用原码求补码的策略需要先判断真值的正负,如果是负数,执行操作:将该负数(真值)的原码的符号位之外的位的按位取反末尾+1,符号位不变)

补数求法之相反数的补数

[ B ] 补 = b 1 b 2 ⋯ b n ; [ − B ] 补 = ∼ [ B ] 补 + 1 = b 1 ‾   b 2 ‾   ⋯   b n ‾ + 1 ; 其 中 b 1 b 2 ⋯ b 3 是 0 / 1 串 ( ∼ ) 是 按 位 取 反 ; ( b 1 ) 是 符 号 位 ; B 是 真 值 , 而 且 正 负 都 适 用 ; [B]_补=b_1b_2\cdots b_n;\\ [-B]_补=\sim[B]_补+1=\overline{b_1}\ \overline{b_2}\ \cdots \ \overline{b_n}+1;\\其中b_1b_2\cdots b_3是0/1串(\sim)是按位取反;\\(b_1)是符号位;\\B是真值,而且正负都适用; [B]=b1b2bn;[B]=[B]+1=b1 b2  bn+1;b1b2b30/1();(b1);B,;

[-B的补数]和[B的补数的相反数]的关系

[ − B ] 补 = − [ B ] 补 [-B]_{补}=-[B]_{补} [B]=[B]

我们知道,等号左边的形式是很常用的

在补码减法公式那里有:

1646388896138

我们只需要令A=B

[ B − B ] 补 = [ B ] 补 + [ − B ] 补 又 因 为 L H S ( 等 号 左 边 ) = 0 ; 所 以 [ B ] 补 + [ − B ] 补 = 0 从 而 − [ B ] 补 = [ − B ] 补 [B-B]_{补}=[B]_{补}+[-B]_{补}\\ 又因为LHS(等号左边)=0;所以\\ [B]_{补}+[-B]_{补}=0\\从而\\ -[B]_{补}=[-B]_{补} [BB]=[B]+[B]LHS()=0;[B]+[B]=0[B]=[B]

这在浮点数加减法做对阶的时候会经常用到.

当然,我们知道,计算机引入二进制补码是为了方便将减法操作转换为加法操作.

(后面的浮点数加减法会给出例子)

前面还提到, [ − B ] 补 [ -B]_{补} [B] [ B ] 补 [B]_{补} [B]连同符号位在内,每位取反,末尾加1

定点数加法

基本示例

计组_浮点数表示/补码运算:定点数加减法/浮点数加减法(步骤+实例)「建议收藏」

1646369883570

1646370211559

不论操作数是正还是负,在做补码加减法时,只需将符号位和数值部分一起参加运算,并且将符号位产生的进位自然丢掉即可。

溢出问题

  • 一般来说,溢出现象的产生是由于加/减法操作使得结果的绝对值变得过大,以至于机器字长无法表示,具体可能可能由
    • 同号相加
    • 异号相减
      • 例如 (5-(-6)); (-5-6))
  • 不会溢出的情况(这些情况下,运算结果的绝对值不会超过两个操作数绝对值中的任何一个)
    • 同号相减
    • 异号相加

1646370540390

和一般的最左边的1做丢弃处理不同,本例中,丢弃掉最高位1后,两个负数(补码)相加的结果出现正数的结果,显然不对

溢出判断

用一位符号位判断溢出

  • 对于加法
    • 只有在正数加正数和负数加负数两种情况下才可能出现溢出,符号不同的两个数相加是不会溢出的。
  • 对于减法
    • 只有在正数减负数或负数减正数两种情况下才可能出现溢出,符号相同的两个数相减是不会溢出的。

下面以机器字长为4位(含1位符号位)为例,说明机器是如何判断溢出的。

  • 机器字长为4位的补码所对应的真值范围为-8~+7,运算结果一旦超过这个范围即为溢出。
  • 表6.7列出了四种溢出情况。
    • 由于减法运算在机器中是用加法器实现的,因此可得出如下结论:不论是作加法还是减法,只要实际参加操作的两个数符号相同,结果又与原操作数的符号不同,即为溢出。

1646372081727

该结果位溢出所致.

同号相加可能导致溢出,但是也可能未溢出

1646372245414

上例化为十进制时,真值运算表示( − 1 2 + ( − 1 2 ) ) = − 1 -\frac{1}{2}+(-\frac{1}{2}))=-1 21+(21))=1

[ A + B ] 补 码 [A+B]_{补码} [A+B]= 1.0000,而且对应的真值:A + B= – 1,由此可见,用补码表示定点小数时,它能表示–1的值。

  • 计算机中采用1位符号位判断时,为了节省时间,通常用符号位产生的进位最高有效位产生的进位异或操作后,按其结果进行判断。
  • (若异或结果为1 ,即为溢出;异或结果为0,则无溢出。
  • 例6.12中符号位有进位(1),最高有效位无进位(0),即 1 ⊕ 0 = 1 1\oplus0 = 1 10=1,故溢出。
  • 例6.13中符号位有进位(1),最高有效位也有进位(1),即 1 ⊕ 1 = 0 1\oplus1=0 11=0,故无溢出。

变形补码判断溢出

1646377310356

  • 变形补码判断溢出的原则是:
    • 当2位符号位不同时,表示溢出,
    • 否则,无溢出。
  • 不论是否发溢出,高位(第1位)符号位永远代表真正的符号。

1646377168720

此时,符号位为“01”,表示溢出,又因第1位符号位为“0”,表示结果的真正符号为正,故“01”表示正溢出

1646377523312

  • 符号位为“10”,表示溢出。由于第1位符号位为1 ,则表示负溢出。
    上述结论对于整数也同样适用。
  • 在浮点机中,当阶码两位符号位表示时,判断溢出的原则与小数的完全相同。

溢出判断总结

可以根据真值表转换为逻辑表达式:

1646376797186

1646377728404

1646377749283

1646377784518

浮点数规格化问题实例

基本规格化问题

1646305647184

十进制数的浮点数和定点数的表示形式示例

基于原码的规格化数(单符号位)

1646306839531

浮点数加减规格化综合问题

浮点数加减法预处理分析

  • 由于浮点数尾数的小数点均固定在第一数值位前,所以尾数的加减运算规则与定点数的完.全相同。

  • 但由于其阶码的大小又直接反映尾数有效值小数点的实际位置,

    • 因此当两浮点数阶码不等时,因两尾数小数点的实际位置不一样,尾数部分无法直接进行加减运算。
    • 为此,浮点数加减运算必须按以下几步进行

(1) 对阶,使两数的小数点位置对齐。(阶数决定小数点实际位置)

  • 对阶的目的是使两操作数的小数点位置对齐,即使两数的阶码相等。
  • 为此,首先要求出阶差,再按小阶向大阶看齐的原则,使阶小的尾数右移位,
    • 每右移一位,阶码加1,直到两数的阶码相等为止。
    • 右移的次数正好等于阶差。
  • 尾数右移时可能会发生数码丢失,影响精度。

(2) 尾数求和,将对阶后的两尾数按定点加减运算规则求和(差)
(3) 规格化,为增加有效数字的位数,提高运算精度,必须将求和 (差)后的尾数规格化。
(4) 舍入,为提高精度,要考虑尾数右移时丢失的数值位。
(5) 溢出判断, 即判断结果是否溢出

设两个浮点数

x = S x ⋅ r j x y = S y ⋅ r j y \begin{array}{l} x=S_{x} \cdot r^{j_{x}} \\ y=S_{y} \cdot r^{j_{y}} \end{array} x=Sxrjxy=Syrjy

S为尾数,其余部分为阶数

综合示例:浮点数加法与右规

1646383935018

双符号位符号位一同右移
然后在符号位上补位(正数机器数(补码)就补0)

下一个加法例子中也是类似

1646383975809

浮点数减法示例

1646393929643

1646393966485

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/192775.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号