将十二进制精度数125.5表示成单精度浮点数,其尾数是阶码是求结果。

迅兴教育集团—广东省人才培训學院专业从事成人学历、职业资格证考证培训通过率99%,轻松拿证上班族首选。

说明:为确保您能及时享受本站服务以及便于查询已购買记录请填写真实手机号!(注册后可随时修改密码!)

登录密码已默认为您的手机号,如需修改请点击“”

已为您自动登录,秒钟後将自动关闭此窗口

不管您以前是否购买过输入您的手机号即可验证:

◇ 如果以前购买过,验证通过即可查看购买记录以及继续购买;

◇ 如果从未购买,填写手机号后即可随时通过该手机号购买。

为方便您随时查询购买记录请输入您的手机号:

手机号仅作为购买的憑证,本站严格保密请放心填写。

  • 第二步:验证通过并重置密码

找回密码需要验证您的账号信息

  • 第二步:验证通过并重置密码

验证通过!请重新设置您的登陆密码(为方便您记忆建议您以手机号作为新密码!):

  • 第二步:验证通过并重置密码

恭喜您!密码成功找回,请牢记您的新密码!

已为您自动登录秒钟后将自动关闭此窗口!

  • 第二步:验证通过并重置密码

找回密码需要验证您的手机号:

  • 第二步:验證通过并重置密码

验证通过!请重新设置您的登陆密码(为方便您记忆,建议您以手机号作为新密码!):

  • 第二步:验证通过并重置密码

恭喜您!密码成功找回请牢记您的新密码!

已为您自动登录,秒钟后将自动关闭此窗口!

赠送打印版总页数约327页,A4纸胶装

第一部分 名校考研真题

第二部分 经典教材课后习题

 白中英《计算机组成原理》(第5版)课后习题

  第1章 计算机系统概论

  第2章 运算方法和运算器

  第3章 多层次的存储器

  第5章 中央处理器

  第7章 外存与I/O设备

  第8章 输入输出系统

  第9章 并行组织与结構

 唐朔飞《计算机组成原理》(第2版)课后习题

  第1章 计算机系统概论

  第2章 计算机的发展和应用

  第5章 输入输系统

  苐6章 计算机的运算方法

  第8章 CPU的结构和功能

  第9章 控制单元的功能

  第10章 控制单元的设计

 第1章 计算机系统概述

 第2章 数据的表示与运算

 第3章 存储器的分层

 第7章 输入输出系统

 计算机组成原理考研模拟试题及详解(一)

 计算机组成原理考研模擬试题及答案(二)

用圣才电子书APP或微信扫一扫,在手机上阅读本书

圣才电子书(武汉)有限公司 提供技术支持和信息存储空间

进位制是一种记数方式亦称进位计数法或位值计数法,以有限种数字符号来表示无限的数值使用的数字符号的数目称为这种进位制的基数或底数。

常见的有:二二进淛精度八二进制精度,十二进制精度十六二进制精度。

  • 二二进制精度:以0和1来组成的数
  • 八二进制精度:以0~7来组成的数。
  • 十二进制精喥:以0~9来组成的数十二进制精度是给我们看的,因为容易理解
  • 十六二进制精度:以0~9和A、B、C、D、E、F来组成的数。像内存地址网卡的MAC地址。

1.2.1 任意二进制精度转十二进制精度

先来点基础十二进制精度的构造可以这样,比如1024可以使用按权展开法构造:权值为10,指数从0开始

0 0 0 0 雖然看起来没什么软用但是对于二二进制精度,比如01101使用按权展开法可以把它转成十二进制精度:权值为2,指数从0开始

0 0 0 其实如果二二進制精度数中有0的在展开时可以省略类似的,其实八二进制精度十六二进制精度都可以使用按权展开法转换成十二进制精度,因为它們的权值:2、8、16及转换方法本身就是转10二进制精度的方法

1.2.2 十二进制精度转二二进制精度

只需要将以十二进制精度表示的数不断除以2,直箌商为0得出的余数逆着写就可以得到,称为重复相除法如下图:

假设十二进制精度为:101,则:

类似的十二进制精度转八二进制精度呮要一直除以8,十二进制精度转十六二进制精度只要一直除以16

  • 方法二:(熟练后可以很快求出比较小的数)

这种方法每次十二进制精度數减去一个与十二进制精度相近的以2为底的指数,能减的记为1不能减的记为0,并记录相减的结果然后再把刚刚记录的结果重复以上操莋,直到整减


1.2.3 小数点的十二进制精度转换二二进制精度

使用的是重复相乘法,将小数部分乘以2(分数也可以)然后取整数部分,剩下嘚小数部分继续乘以2继续取整数部分,剩一直取到小数部分为零为止(或者积为1为止)如果永远不能为零,就同十二进制精度数的四舍五入一样按照要求保留多少位小数时,就根据后面一位是0还是1取舍,如果是零舍掉,如果是1向入一位。换句话说就是0舍1入如丅图:

注意:小数点的二二进制精度中的指数是从-1开始的,一直减小整数的二二进制精度中的指数是从0开始的,一直增大

1.2.4 二二进制精喥转其他二进制精度

  • 二二进制精度转八二进制精度:只要把二二进制精度中从右到左每3位,按权展开并相加不足3位的补0,最后把这些结果组合起来即可
  • 二二进制精度转十六二进制精度:只要把二二进制精度中从右到左每4位,按权展开并相加(如果结果超过9那么用A、B、C、E、F表达),不足4位的补0最后把这些结果组合起来即可。

2. 有符号数与无符号数

针对二二进制精度来说可以分为两种:

  • 有符号数:有正负徝使用最高二二进制精度位来表示符号,这一位被称为符号位(Sign bit)人们规定,符号位为 0 表示正数符号位为 1 表示负数。范围:-2^(n-1) ~ 2^(n-1)-1 (其中n為二二进制精度数的位数)
  • 无符号数:无负值范围:0 ~ 2^(n-1)-1 (其中n为二二进制精度数的位数)

假设二二进制精度以8位为例,有符号数得把最高位作为符号位那么其余7位来表示二二进制精度数,而无符号数8位都可以表示一个二二进制精度数所以有符号数可表示的最大值比无符號数可表示的最大值小:

  • 有符号数可表示的最大值: -> 127(最左边,也就是最高位为符号位所以可表示的范围只有后7位)

  • 无符号数可表示的朂大值: -> 255(没有符号位的概念)

对于有符号数可表示的最小值,比较特殊通过上面的公式,有符号数可表示的最小值为-128这里有个问题?为什么是-128而不是-127不应该是(最高位为符号位)??等学了补码和反码在补充!因为其实-128是用补码表示的

Java中没有无符号数,C++有

有苻号数可以分为正值,原码、反码、补码四种编码实现

正值:其实就是求出一个数的绝对值的二二进制精度数,不看符号位比如-3的正徝:0011;4的正值:0100。后面要用该知识

原码其实就是有符号数:在符号位使用0表示正数、1表示负数。就是为了能够表示负数

但是可以发现,对于十二进制精度数0按照原码的表示,可以有00和10这样就有争议。更重要的是当两个符号位不同的二二进制精度进行运算时,会出錯例如:1+(-1)=0,在计算机中是使用二二进制精度运算的假设二二进制精度数有4位,所以变成:10换算成十二进制精度为-2,这明显错了

当嘫也有另一种运算方式:判断两个操作数绝对值大小,使用绝对值大的数减去绝对值小的数对于符号值,以绝对值大的为准但是这样恏麻烦啊!!而且计算机规定只会加法操作(因为只有加法器,先不管其他操作怎么处理)

自从引入原码,那以后给出的二二进制精度轉换十二进制精度最高位究竟是符号位还是数字位?假设题目没有明说那就是没有符号位的,假设要有说符号位或者转成原码,那麼就肯定有符号位

像平时的二二进制精度运算,没特殊说明就直接相加没问题。

用正数的原码进行运算肯定没问题但用负数的原码進行运算就有问题了,所以为了让原码运算时不出错并且要消除减法操作,提出了反码

反码在原码的基础上提出,定义:(别管怎么來)

0 0 根据公式对于正数的原码跟反码一样,而对于负数来看看下面的例子,假设有4位二二进制精度数:

本来按照上面的计算-2的反码應该是11101,但是现在我们只有4位二二进制精度数所以自然舍弃最高位。然后剩下的4位中最高位还是表示符号位

按照上面的例子(下面:2.3 補码 中得出的结论我先拿上来用),我就先直说了原码和反码的关系:对于正数它的反码和原码是一样的;对于负数,它的反码等于原碼除符号位外其余位取反(即0变11变0)。可以多用几个数试试

现在利用反码来计算:1+(-1)=0,假设有4位二二进制精度数:

1111是反码逆向思想转荿原码,得:1000即用十二进制精度表示:-0。这样运算就正确了虽然对于0还是有+0和-0的争议。

但真的运算就都正确了吗再来一例子:5+(-3)=2,假設有4位二二进制精度数:

10001有5位但是目前是使用4位二二进制精度数,所以舍弃最高位即:0001,转为十二进制精度:1可以看到跟结果还差1。 再来例子:6+(-2)= 4假设有4位二二进制精度数:

还是跟上面一样,结果舍弃最高位得:0011转为十二进制精度:3。还是跟结果相差1有两个例子那么就可以得到:反码虽然在运算时没有使用减法,但是再求反码时使用了减法并且还是不能运算正确,而且对于0还是有歧义究竟是-0還是+0。

补码是按照下面的公式定义的:

0 0 可以看到对于正数,它的补码跟原码一样对于负数,涉及到了减法操作

此时利用补码来运算剛刚的例子:1+(-1)=0,假设二二进制精度数有8位现在使用补码来表示:

  • 相加:000。注意结果有8个0一共9位,首先我们规定二二进制精度数有8位僦是一个可表示二二进制精度数范围(实际可表示的只有7位,第8位为符号位)所以其实进位了,但是目前只能用8位表示会自动舍去最高位,即就是我们的最终结果。

通过上面的运算发现对于0的歧义也解决了,补码就是用来表示0的

记住,计算机如果要判断符号位开銷比较大所以在补码中干脆把符号位一起运算

想必还是有很多问号?这样还是有减法操作啊!!!画张表来看看有没有规律,一個数的原码和补码、反码的联系:

  • 正数的原码、补码、反码都是一样的
  • 负数的原码,把原码中除符号位的0换成11换成0就变成了反码;而反码和补码又有联系,就相差1即负数的补码等于反码+1。
  • 其实也可以通过原码心算出补码仔细观察负数的原码和补码有没有什么联系,峩就直说了:从原码的右边(低位)开始找到第一个二二进制精度数:1,然后把第一个1之后(左边不包括第一个1)的0换成1,1换成0符號位不变。 计算机不是用该操作

所以,计算机中二二进制精度的运算是以补码来进行运算(当然也有说:计算机对正数是以原码来进行運算对负数是以补码来进行运算,其实都可以但一条句子是不是更方便记住),反码的提出是为了让计算机求出补码在计算机中很嫆易实现,因为有:非门所以计算机的计算是:先求出正值,再全部用非门取反得出反码,再加1就得出补码,比如-3的补码:

  • 全部用非门取反:1100得出反码;

我们人工就不必使用减法(公式)去求什么补码,反码直接套用该规律,而计算机也巧妙地避开减法操作把減法转换成加法。

想到要是两个负数转成补码相加的话符号位产生进位,如果自然舍去结果却变成正数,是不是有很多问号啊?

箌此,会对上面的进位(自然舍去)进位(自然舍去)是属于正常的运算范围,而还有一种就是溢出溢出的话是属于不正常的运算范圍。

谈谈溢出加法运算时有以下情况:

  • 正数+负数(或负数+正数)

减法有以下情况:有了补码,用加法来替换

  • 正数-正数:对应上面第一种凊况转换为:正数+(-正数)
  • 正数-负数(或负数-正数):对应上面第二种情况,转换为:正数+(-负数)
  • 负数-负数:对应上面第一种情况转换为:負数+(-负数)

所以只看加法来判断溢出:使用双高位来判断溢出,即用C1表示符号位是否进位C2表示数值部分最高位记是否进位,假设有4位二二進制精度数有以下的情况:

  • 当C1为真,C2为假:说明溢出了因为两个符号位原本为1,进位后变成0(进位后变10而符号位取后一位),说明錯误了称为负溢出。
  • 当C1为真C2为真:比如5+(-3):转为补码:010,因为只有4位二二进制精度数所以舍去最高位,变为:0010正确结果。
  • 当C1为假C2為假:比如-5+3:转为补码:10,正确结果
  • 当C1为假,C2为真:说明溢出了因为两个符号位为0,在C2进位后符号位变成1,说明错误了称为正溢絀。

还有其他判断方法比如变形补码。也就是双符号位的形式(把原来单符号位变双)去运算当运算结果的符号位出现“01”或者“10”時,则表示产生溢出 很简单,可以试试


  • 正数和负数之间的相加一定不会溢出。
  • 正数和正数相加有可能会溢出溢出的情况是数值部分姠符号位进位,即相加后符号位为1变成负数,说明溢出称为正溢出。
  • 负数和负数相加有可能会溢出溢出的情况是符号位进位了,即楿加后符号位为1变成正数,说明溢出称为负溢出。你说:啊那正常两个负数相加的符号位都为1,不都进位吗你可以试试,比如我使用-3+(-2):转为补码:011舍去最高位,得:1011所以负数加负数相加,如果不溢出的话符号位肯定还是1但是需要自然舍去一位。

而计算机是怎麼处理溢出的参考高级语言的基本数据类型,当两个数相加后超过了基本数据类型能表示的范围时发生了什么其实还跟下面的原理有點关系,就是使用同余定理

2.3.2 补码的原理(了解)

补码的原理是利用模运算和同余定理。

模是指一个计量系统的计数范围如时钟的计量范围是0~11,模 = 12“模”实质上是计量器产生“溢出”的量,它的值在计量器上表示不出来计量器上只能表示出模的余数。

模运算:比如 5 Mod 1 = 1洳果按照高级语言的写法:5 % 1 = 1。这里说个技巧:整数要是小于模的直接输出整数,要是等于模输出0要是大于模,则输出:整数-模的结果

同余定理是模运算中的重要定理():**两个整数除以同一个整数,若得相同余数则二整数同余。**记作 a ≡ b (mod m)读作 a 与

找个例子并结合计算機来理解,时钟就是天生的使用同余定理的物品时钟可以显示112(或者011)的数字,说明模为12假设现在指向6点,我们要调到4点那么按照公式:6-2=4,即回调到4点这里需要用到减法,想想有没有另一种方法把减法替换成加法

可能想到了,就是让指针前调即:(6+10)Mod 12 = 4。这里就紦减法转变成加法即可以把减2当成加10来看待,以下是证明:

  • 对于正数的求余很简单按上面模运算我说的技巧,其实你就可以知道对于囸数的补码为什么跟原码一样因为正数求余后还是正数,比如 1 MOD 4 = 12 MOD 4 = 2。
  • 对于负数的求余需要一条公式:x mod y = x - y ??(x / y )意思是:x减去y乘以(x除以y嘚商然后向下取整,即取下界)要理怎么来去百度吧,并且高级语言对负数去模的结果可能不同

??:该符号表示向下取整,即比自巳小的最大整数比如 1.7,那么向下取整后为1

??:该符号表示向上取整即比自己大的最小整数,比如 1.7那么向上取整后为2

跟二叉树中的floor囷ceil一样。

来试试负数求余的公式:

现在回到时钟去刚刚说减2当成加10来看待,那么来看看

所以-2和10是同余的或者称为互为补数所以在12为模嘚系统中,-2可以看成是+10其实可以看成是-2加上一个12的周期,得出10那么把6记为a,-2记为b12记为mod,则用公式来表达:a - b = a - b + mod = a + (mod - b)

总结一句话:在有模的系统中,减去一个数可变成加上它的补数

现在回到计算机来,假设有4位的二二进制精度数除符号位外,其范围为-8~7一共有16个数,那么模为2^3=16能够表示的最大二二进制精度为0111,那么此时加1得:1000,而1000其实是-8(对于有符号数来说不懂看下面的对于-128的解释),这也就跟时钟┅样形成一个环。

所以假设当前的数为6想要变成2的话,那么我们就得减掉4但是减法计算机不能运算啊,所以可对减4再加上一个16的周期(模)得出12,所以减4和加12其实是一样的你可以画条水平线,然后把-8~7填上然后在6的位置加12试试。此时按照8位的表示范围纳闷12怎么求,其实计算机只是学了思想并不一定像它那样操作,可看看下面的运算过程:补码的推导

     # 按以上理论,减一个数等于加上它的补数所以 # 等价于 其实 16 - 2 不就是上面补码定义的公式求负数给出的 2^n + x 吗?回去看看 # 用二二进制精度表示则为: # 等价于 其实下面是求出反码了计算機是直接到这一步,因为有非门的存在根据正值直接全部按位取反。可能有人要说了要是正数怎么办,最高位不是也变了吗:不对!正数求反码不变啊。 # 所以从这里可以得到-2的补码 # 即 `-2` 在计算机中的二二进制精度表示为 `1010`正是“ -2 的正值 20010)的补码(1110)”。这就是补码的嶊导 10100 而只有4位舍去最高位得:0100,转为十二进制精度:4正确!! 

对于8位的二二进制精度,-128用补码表示的解释:其实是取消了原码和反码對于0的歧义问题在补码中就直接用来表示-128。计算机就固定用来表示-128并且是不能转换的,比如有人要把-128转为原码和补码这是错误的。這也解释了为什么最小值还会多出一位因为多出的一位用来消除0的歧义。

(看看计算机自带的计算器)

可能你会问那如何表示128那么128肯萣是要数据能够表示的范围啊!!对于8位表示不了128。我废话了。

补码原理花了我好长时间今天终于搞完了,虽然可不知道原理但是現在复习阶段碰到了就搞搞吧。

0 0 前面在二进制精度转换中已经有说了小数的转换那么求小数的原码也很简单。

更重要的是小数的原码,反码补码怎么求是跟整数的求法一样的。

对于小数的符号位放哪有些书放在小数点之前,比如:1.01010.10,也有额外再开个空间存储符号位比如:10.0101,00.10这些都可以。

我直接拿老师的例子:他是额外开空间存储符号位的

计算机中处理的数据经常带有小数点而小数点在计算機中有两种表示方式,一种就是定点数另一种就是浮点数。

定点数:小数点固定在某个位置的数称为定点数按照位置的不同,可分为兩种:

  • 定点小数:小数点默认位于数值部分的左边整数位则用于表示符号位,称为纯小数(相对于二二进制精度来说)但是小数点也昰隐含的,即不占位比如(都是二二进制精度表示):0.001(十二进制精度数为:0.125),1.0111(-0.45假设保留4位小数点)等。

(网上还有老师都是上圖但是我百度纯小数时,比如百度百科中说:整数部分为零的小数叫做纯小数其实它表示的是十二进制精度,符号位是’+‘或’-’仳如:0.12,-0.2333等)

,一般来说如果最末位 1,前面各位都为0则数的绝对值最小,即|x|min= 2^(-n) 如果各位均为1,则数的绝对值最大即|x|max=1-2^(-n)。所以定点小數的表示范围是:(其中n为二二进制精度数的位数)

  • 定点整数:小数点默认放在 有效数值部分之后最高位还是符号位,称为纯整数(相對于二二进制精度来说)但是小数点是隐含的,即不占位比如(最高位为符号位):0001(十二进制精度:1),00101011等。而范围就是上面有苻号数那个范围:-2^(n-1) ~ 2^(n-1)-1 (其中n为二二进制精度数的位数)

但计算机通常遇到既不是纯整数又不是纯小数比如:10.2,3.53等

对于计算机来说,需要紦它统一称纯小数或纯整数怎么搞?数据按比例因子缩小成纯小数或扩大成纯整数再参加运算,结果输出时再按比例折算成实际值鈈过有点麻烦,所以提出浮点数

浮点数:是属于有理数中某特定子集的数的数字表示,在计算机中用以近似表示任意某个实数具体的說,这个实数由一个整数或定点数(即尾数)乘以某个基数(计算机中通常是2)的整数次幂得到这种表示方法类似于基数为10的科学计数法

0

  • 8:称为指数表示的是小数点的真实位置。

4.1 二二进制精度科学计数表示法

而对于浮点数的表示格式跟科学计数法一样前两个数的称呼也跟上面一样。而指数在这里称为阶码

  • 计算机中保存的格式如上的蓝条,其中对于基数不用存储因为在计算机中默认就是:2
  • 在浮點数中尾数的位数越多,有效精度越大在计算机中尾数用补码表示。对于尾数是有要求的就是尾数必须是纯小数如果尾数最高位為1的浮点数称为规格化数规格化主要是为了提高精度。
  • 阶码的位数越多表示的范围越大。这里的阶码在计算机中用补码表示

浮点数嘚例子,都是以二二进制精度表示的:

  • 上面的写法都是合法的就拿第一个来看。一般运算都是需要规格化浮点数
  • 0.0110101:以二二进制精度表礻的尾数,必须转成纯小数小数点之前是符号位。
  • 2:基数在计算机中默认为2。
  • 3:以十二进制精度数表示称指数或阶码。
  • 那么在计算機中就是这样存储的(根据上面的蓝条):0 11 0 (假设8位尾数不足8位在后面补0,不是前面补0因为是这有小数点的,这里采用原码表示)
  • 小數点右移一位阶码-1小数点左移一位阶码+1。

对于原先的二二进制精度科学计数法因为早期不同机器上的默认的阶码位数和尾数长度可能鈈一样,所以对浮点数的表示有点差异所以就要统一浮点数的表示,提出IEEE754标准

  • 在IEEE754中,少了阶码的符号位阶码用移码表示。移码是阶碼加上一个偏移值因为阶码有正负,而IEEE754不保存阶码的符号位所以使用一个偏移值,来取消阶码的正负之分(其实就是把一个有符号数變成无符号数)因此少了阶码的符号位。
2e?1?1(e为阶码位数)比如8位阶码的偏移值为:
  • 移码的好处:采用指数的实际值加上固定的偏迻值的办法表示浮点数的指数,好处是可以用长度为e个比特的无符号整数来表示所有的指数取值(就不用浪费一位存储阶码符号位)这使得两个浮点数的指数大小的比较更为容易,实际上可以按照字典序比较两个浮点表示的大小像以前使用补码来表示阶码,要比较大小佷难比较
  • 尾数必须是纯小数,如果尾数最高位为1的浮点数称为规格化数这么说当然还有非规格化的数和一些特殊值。
  • double(双精度64位,苻号位1位阶码11位,尾数52位),float(单精度32位,1位符号位8位阶码位,23位尾数位)使用IEEE754表示的待讲。
  • IEEE754根据阶码和尾数还可以再分类

    所谓规格化,就是要求尾数最高位为1这可以通过阶码调整。所以在IEEE754中可以把最高位的1省略掉因为规格化浮点数默认最高位肯定是1啊。所以有了以下的公式:

    • (1+M):因为能控制阶码所以可以对原先的尾数进行操作,把尾数最左边第一个为1提到小数点左边而小数点右边僦当成是M,比如:0. 按照说法,变成:1. * 2?3而存入计算中只需要存入:就行。而拿出来时就需要M+1由此可得规格化浮点数的范围为:1<=1+M<2。(1<=M<2也有这样的,这里的M指的是原先没有去最高位1的尾数)
    • 根据上面对于规格化的浮点数,单精度的尾数为23位但实际上为24位,双精度也昰隐藏了一位所以从规格化浮点数转换到十二进制精度时需要注意尾数。
    • 上面的尾数的疑问说要是找不到1怎么办,就是全为0这是一個特殊值,有特殊处理
    • 规格化后的尾数的最高位:正数的原码和补码最高位都是1,负数的原码最高位为1负数的补码最高位为0。网上的規格化题目很多都是用原码表示的那么下面的题就都用原码表示,容易理解而按网上说的现阶段计算机中的数据都是按补码表示的,那我认为在计算机中的浮点数尾数是补码形式有错指出。
    • 阶码用移码表示移码=阶码+偏移值。偏移值= 2e?1?1(e为阶码位数)
    • 对于阶码进┅步解释,按照单精度有8位阶码因为没有符号位,那么阶码可表示的范围为0~255(十二进制精度表示)但0(二二进制精度全为0)和255(二二進制精度全为1)是特殊值,那么阶码可表示的范围为1~254那负数怎么表示?借助偏移值单精度的偏移值为127,所以阶码实际上表示的范围为:-126~127

    拿个例子:假设把-5.125转成规格化的单精度浮点数。(单精度浮点数为4个字节IEEE754规定1位为尾数符号位,8位为阶码23位为尾数,这里用原码表示)

    1. -5.125转成二二进制精度:-101.001把符号位和尾数分离,此时S = 1
    2. 所以按照规格化的格式:尾数符号位 阶码 尾数:1 01 00 。

    (我看百度百科写得很好僦直接拿过来这两段)

    如果浮点数的指数部分是0,尾数部分非规格化那么这个浮点数将被称为非规格化的浮点数。在这样情况下阶码=1-偏移值,尾数就是原先的尾数即不隐含尾数开头的1。

    一般是某个数字相当接近零时才会使用非规格化浮点数来表示其实可以把表示0归類在非规格化浮点数。(重要)

    754标准规定:非规约的浮点数的指数偏移值比规格化的浮点数的指数偏移值小1例如,最小的规格化的单精喥浮点数的指数部分编码值为1指数的实际值为-126;而非规格化的单精度浮点数的指数域编码值为0,对应的指数实际值也是-126而不是-127实际上非规格化的浮点数仍然是有效可以使用的,只是它们的绝对值已经小于所有的规格化浮点数的绝对值;即所有的非规格化浮点数比规约浮點数更接近0

    为什么要让非规格化浮点数的指数偏移值比规格化浮点数的指数偏移值小1?为了补偿非规格化数的尾数没有隐含开头1其实非规格化浮点数经常性的与规格化浮点数互相转换,所以这是为了让非规格化浮点数能够平滑转换到规格化浮点数减少误差。虽然可能還是有误差

    来看看《深入了解计算机系统》的浮点数中讲的:解释为什么阶码要用1-偏移值表示。


    • 如果指数是0并且尾数的小数部分是0这個数±0(和符号位相关)。假设为单精度:

    • 根据IEEE754这两个值是不同的。
  • (2e)?1
    (转为二二进制精度就是阶码全为1)并且尾数的小数部分是0这個数是±∞(同样和符号位相关)。假设为单精度:
    • (2e)?1(转为二二进制精度就是阶码全为1)并且尾数的小数部分非0,这个数表示为不是一個数(NaN)比如:Math.sqrt(-1)。假设位单精度:

      • 双精度的也可以求根据尾数位数,所以一共有

      • 一些运算结果不能是实数或者无穷就会返回NaN,比如:Math.sqrt(-1)

    • 4.6 浮点数的表示范围

      假设阶码位数为m位,尾数位数为n位先按非零浮点数来说,它可以表示上面三类数跟高级语言联系,按照java中的浮點数最小值是非规格化数最大值是规格化数。


    我要回帖

    更多关于 二进制精度 的文章

     

    随机推荐