【知识强化】第二章 数据的表示和运算 2.3 浮点数的表示与运算

之前我们已经把定点数的表示和运算都全部地讲完了,那么从本节开始我们将要进入浮点数的表示和运算当中。那么浮点数是和定点数不一样的一种存在,那么这一节课呢我们将要讲浮点数的表示的前半部分。

那么表示我们将以两节课的形式把它们全部讲完。这节课我们将要讲浮点数的基本格式、规格化,这是重点。表示范围因为在大纲里面已经把它删掉了,所以大家只要做稍微的了解就可以了。那么下一节课将要讲一个标准叫做IEEE 754标准,这个标准是非常重要的,考试也经常考,所以用红框子框出来的呢就是我们浮点数表示的一个重点。那么什么叫浮点数呢?之前我们讲定点数的时候已经稍微地提了一下。

我们一个r进制数,它的值是这样的。蓝色部分就是它的小数部分,那么我们知道,小数想要在计算机当中表示出来的话,有两种形式。一种形式呢就是采用定点数的形式。因为我们的计算机是没有办法表示小数点的,是没有一个专门的硬件来表示它就是一个小数点,所以我们没有像数学当中这么灵活的一个表示方式来表示这就是一个小数点。那么怎么办呢?我们就采用了两种方式。

第一种就是我们的定点数的方式,我们约定小数点就在某个地方。比如纯小数就固定在数值位的最前面,符号位的后面,那么这是纯小数的形式。纯整数我们就约定小数点固定在数值位的最后。

那么这样的表述形式显然是远远不能够满足我们的需要的,因为我们可能需要像这样的一种形式。比如我们的十进制数,光速我们知道是一个这样的数值,299792458。那么如果把它表示为一个定点的整数的话,就是用9个位去存它。但是显然这样的方式是非常不方便的,那么怎么办呢?在数学当中我们就提出了叫做科学计数法,就是用2.998*10^8这样的形式来表示这样的一个十进制数。那么前面的这部分呢我们可以根据它的需要来保留不同的小数位数来表示它的精度。而后面的10^8,就说明它有这么多,它的范围是这么多。所以,我们就用这样的一个思想,来存放我们的小数,那么这就产生了浮点数。什么叫浮点数呢?顾名思义就是说小数点是可以浮动的。

也就是说我们用适当的形式把一个比例因子表示在数据当中,让小数点的位置根据我们的需要而进行浮动。那么怎么进行浮动呢?那么就采用我们的科学计数法这样的思想来表示我们的浮点数。

所以我们浮点数的形式是这个样子的。它的真值N=r^E*M。我们可以看到这和我们的科学计数法是异曲同工的。

这里的r就是阶码的底,和r进制数里面的那个r其实是差不多的。通常呢,我们取2为底。那么如何把它存放到计算机当中?显然我们计算机不可能用这样的形式来存放。我们已经约定了r都是2,所以呢我们只要存放两个部分,一个就是我们的指数E,一个就是我们的M。所以我们用两个定点数来存放到计算机当中。

就是这个样子。前面的部分,Jf一直到Jm,那个叫做阶码。

也就是我们的E的部分。

而后面,Sf一直到Sn,我们叫做尾数也就是我们的M,所以这两个都是定点数。前面呢,是一个定点整数,因为我们的E是在指数位置上,就相等于10的8次方的那个8。而后面呢,是一个定点小数,就相当于我们的2.998这个样子。但是这时候我们是用定点小数的形式,所以呢必须是0.几。啊之前我们讲定点数已经讲完了,所以我们先讲定点数再讲浮点数。因为我们的浮点数就是相当于是用两个定点数拼接而成的。

那么我们的阶码呢?通常用补码和移码表示。而我们的尾数呢?通常用原码和补码表示。这个呢,我们之前讲移码的时候就已经讲了,移码的一个功能,就是用作浮点数的阶码。而我们的题目当中是会给你它用什么码表示的,这个是不太确定的,所以呢我们根据题目的需要,它告诉你是什么就是什么。

那么它们分别有什么含义?我刚才已经讲了。阶码是表示浮点数的表示范围,也就是E,也就是我们的10的8次方的那个8。它是表示我们浮点数有多大,10^8嘛就是那么大。以及小数点的实际位置,它乘以多少,乘以10的8次方,说明它的小数点就在哪里,就是2.998*10^8,它的小数点在哪里,它的小数点的实际位置。所以呢通过它就可以进行一个上下的浮动。通过我们的阶码呢进行改变,我们的小数点呢就可以进行一个理论上的一个浮动。而尾数M它的位数反映了我们浮点数的精度。就比如说刚才的2.998,它有三位小数,所以我们的精度就是这么多。我们还可以把它的精度扩的更大,所以尾数M的位数,我们这里所说的位数呢,就是除去符号位的那一部分,它的位数反映了我们的浮点数的精度,大家要明白阶码和尾数它的含义它的功能是什么。我们浮点数的形式就是就是这个样子,大家一定要牢牢地记住浮点数是什么样的形式。它的表示、表达式是这个样子,而它在计算机当中就是存放E和M。

我们来看一个例子,加深一下我们的理解。阶码和尾数都采用补码表示,

 

那么我们来看一下浮点数表示的第二部分,也就是一个标准叫做IEEE 754标准。

那么我们上一节课已经把浮点数表示的基本格式规格化以及表示范围讲清楚了。那么IEEE 754标准是什么呢?就是根据我们上一节课的讲的内容,再进行一些相关的约定,就形成了我们的IEEE 754标准。

我们首先来看一下这个标准的一般形式,就是这个样子的。对这个和我们上一节课讲的我们浮点数表示的一般形式有什么区别呢?就是把尾数的符号位放到了前面。并且,我们还注意到我们的阶码,约定用移码进行表示。关于移码是什么我们在定点数的那一部分已经讲过了。

那么尾数部分还隐含了一个条件,是什么呢?就是说隐藏表示最高位为1。因为我们尾数部分约定是用原码表示,而原码表示我们之前讲规格化时候已经讲过,原码的规格化最高位必须是1,因为它是一个有效位。所以既然我们约定了它是1,所以我们就不需要再去存储这个1了。这样的话呢我们还节省了一位的空间。并且,这时候隐藏的最高位为1,表示1.多少多少。

如果这时候尾数是这个样子,

那么表示的就是1.多少多少。要注意啊,这时候最高位是1并且它表示尾数是1.这么多,把尾数加到1.它的后面。

好的,那么我们来看一下关于IEEE 754标准规定的一些常用的浮点数的格式。我们考试常考的呢就是短浮点数和长浮点数。临时浮点数呢我们了解一下就可以了。并且这个表格大家一定要把它记住。如果实在记不住的话,大家做几道题来加深一下印象。而临时浮点数呢,我们只要考前在进行一些梳理的时候,大概地看一眼就可以了。那么短浮点数呢, 又把它叫做单精度数或者float型,大家在编写一些程序设计语言的时候,特别是C语言,大家已经用到过了,也就是我们的短浮点数表示的就是我们的单精度或者叫float,而长浮点数就是我们的双精度或者叫double。那么它分别有哪些规定呢?我们的短浮点数,规定它一共有32位,大家应该都知道,短浮点数也就是我们的float型,都是32位。而长浮点数呢都是64位。那么短浮点数的这32位分别是哪些位呢?首先是1位的符号位,这时候的符号位是我们的尾数的符号位也就是我们的数符位,它是1位。阶码我们规定是8位,阶码是8位。尾数呢就剩下的就是23位,因为它总共要是32位,所以尾数是23位。大家一定要把它记清楚。并且,偏置值,偏置值,我们之前讲我们移码的时候,是怎么来表示的呢?就是在它的上面加上一个偏置。所以我们规定,短浮点数的偏置127,为什么是127而不是2的指数幂呢?因为要和后面的这个尾数进行一个配合,所以我们就规定它是127。长浮点数就是规定它是1023,而不是1024啊,是1023。它的数符是1位,阶码是11位,注意是11位,尾数是52位。我们只要记住阶码就可以了,然后记住它的总位数我们尾数就可以知道是多少了。

比如我们写一串数字,大家如果实在记不住的话,我们就写一串数字来加深一下理解。首先我们写一个32位,随便写一个32位数,然后第一位肯定是它的数符位,是1。后面的8位,是它的阶码,也就是我们的E的部分,是它的阶码,我们通常用移码来表示。最后剩下的部分呢就是我们的尾数,那么这就是我们的数符、阶码和尾数,它的位数是多少。

那么同样的,我们可以再写一个64位数的一个东西,写一个64位数的东西。第一位是它的数符位,后面我们再写11位,就是它的阶码。剩下的部分呢,都是我们的尾数。这样大家,都可能有一个直观的印象了,到底是什么。所以,我们要记住它的长度是多少。而关于临时浮点数呢我们只要了解一下就可以了,一般的考试呢很少会考到,做一个简单的了解。

那么,我们的规格化的短浮点数的真值,是多少呢?也就是(-1)^s,那么s就是我们的数数符位。数符是多少,s就是多少。再乘以1.,M是什么?M就是我们的尾数,啊尾数就是M。再乘以2^(E-127)。注意,我们的偏置刚才讲过了,短浮点数的偏置是127,所以这时候我们的短浮点数的真值就是2^(E-127)。所以短浮点数的真值,就是(-1)^s。s就是我们的第一位是多少,s就是多少。再乘以1.多少,1.后面的那个东西呢就是我们的尾数,那么我们隐含地存放1个1。再乘以2^(E-127),就是我们的短浮点数。这个公式牢牢地记住。同样的长浮点数,只不过把后面的127换成了1023,就可以了。它的这个公式大家一定要记住,记起来也是非常容易的。(-1)^s*1.M*2^(E-偏置值)就可以了。短浮点数是127,长浮点数是1023。这就是我们的IEEE 754标准。大家一定要把这一页的PPT牢牢地记在心里。

好的,我们来看一下它的一些其他标准。有一些规定我们只以短浮点数为例。

首先,如果出现了E为0,M为0的时候,也就是我们的阶码是0,尾数是0,我们规定真值就是0。那么如果阶码是0,而M不等于0的话,我们规定它是一个非规格化数,这是另外规定的啊,它的真值是(-1)^s*0.M,注意这时候变成了0.M,再乘以2^(-126),至于为什么是-126,这是一个特别的规定,为了在后面我们讲范围的时候,能够平滑地进行一个连接而进行的规定。注意这时候E如果一旦为0,它就是一个非规格化的数,它的真值是(-1)^s*0.M*2^(-126)。如果E在1-254之间,也就是不是全1也不是全0的时候,那么它的真值就是一个正常的值,正常的一个短浮点数就是这样的一个范围,E在1-254之间,它是一个正常的范围。而如果E全1的时候,E全1也就是E=255的时候,如果M不等于0,那么它就输出一个非数值的字符串叫做NaN,表示它不是一个数,这是另外的一个规定。如果E是全1,M是全0表示真值为正无穷或者负无穷。如果符号位是0,它就是正无穷。如果符号位是1,它就是负无穷。这样呢我们的IEEE 754标准就把它能够表示的数,以及它能够出现的一些问题,完整地给规定了,并且还能够表示正无穷,还能够表示负无穷,还能够表示0,还能够表示一个非数值。那么什么时候会出现非数值呢?一旦发生除以0,这个东西除以0了,这样的时候出现了一些非数值错误的时候,它就产生这样的一个数,表示它是一个非数值。这些都是一个另外的规定。而我们一般的正常的范围呢,就是在我们的第三条,也就是E在1-254之间,我们的真值就是这样的一个表示,我们刚才也已经讲过了。

那么IEEE 754它的浮点数范围在哪儿呢?当E=1的时候,因为它不能是全0嘛,所以E最小只能是1,而M是0的时候,这时候它的最小值就是2^(-126)。这时候就和我们上面的非规格化数为什么是2的负126呢,就能够完全地连接起来。最大值呢E不能是全1,那么最大值只能是254。所以这时候最大值就是2^127*(2-2^(-23)),这是我们的最大值。注意这时候我们所讲的最小值和最大值都是它的绝对值的最小值和最大值,并不是我们的真值最小和最大。而双精度呢,同样的用这种方法,就可以求出它的最小值和最大值了。那这就是我们的浮点数IEEE 754标准,已经讲完了。重点不在这儿,重点在我们的上一页PPT,它的位数是多少大家一定要记牢并且以及它如何求出真值要把那个公式牢记于心。那么这就是我们的IEEE 754标准。

好的,我们整个浮点数的表示就已经完全讲完了。我们讲了哪些内容呢?用红框框框出来的部分是我们的重点,表示范围不作要求了解即可。基本格式大家一定要知道它是怎么表示的,它的阶码和尾数分别代表的是什么,以及规格化。原码的规格化,正数最高位必须是1,负数最高位也是1。补码呢?正数的最高位和原码是一样的。而负数的最高位,因为它要取反再加1,所以必须是0,这是规格化。以及左规和右规分别在哪种形式下出现,我已经举了两道例题,大家回去一定要认真复习。并且这一节课,我们讲了IEEE 754标准,它是如何表示的。那张图大家一定要记着,第一位是数符位,也就是最高位为数符,阶码用移码表示并且它的偏置量是多少,一个是127,一个是1023。尾数是用原码表示的,所以因为它是原码表示的,所以它的最高位1已经被隐含地保存起来,所以就不需要再用一个多余的位数来保存这个1了。所以呢,我们的短浮点数、长浮点数和我们的临时浮点数它的这个每一位的位数是多少,大家一定要完全地记住。还有一些特殊的形式,大家也了解一下就可以了。那么我们整个浮点数的表示就讲到这里。

那么,我们已经把浮点数的表示全部讲完了,那么这一节开始我们将要讲解浮点数的运算。考纲当中呢只要求掌握浮点数的加减运算,并且书上也只有浮点数的加减运算,所以我们就来讲解一下浮点数是如何进行加减的。

那么浮点数的运算呢,我将要花两节课给大家讲一下,这一节课将要讲加减运算,总共有这么多的步骤。那么下一节课呢我们将要讲解强制类型转换的最后一部分内容。前面一部分内容呢我们已经在定点数的部分全部讲完了。

那么浮点数的加减运算有哪些步骤呢?首先进行对阶,然后尾数加减,然后规格化,然后舍入,然后判断它是否有溢出。同时在对接之前我们将要有一个真值到机器数的一个转换。如何进行真值到机器数的转换,就是把我们的真值表示成我们浮点数能够表示的机器数的形式。其中舍入我们只要做一个适当的了解就可以了,因为考纲当中并没有对舍入做太多的要求,而且舍入的规则是十分复杂的,所以我们只要了解一下就可以了。但是这些步骤,大家还是要完全掌握的。

我们来看一道题目。已知一个十进制的数X=-5/256,Y=+59/1024,我们按照机器补码浮点运算规则计算X-Y,结果呢用二进制来表示。它给出了一个浮点数的格式我们要遵循它的这个格式。阶符我们要取两位,阶码我们取三位,数符呢取两位,尾数取9位。那么我们根据浮点数的运算规则,总共有这五步。那么在此之前,我们先要对浮点数进行一个真值到机器数的一个转化,我们要把X和Y表示成题目中所给的浮点数的一个格式。

首先我们先计算X,X是-5/256,

 

我们按照题目当中的给出的补码来进行表示。5它的二进制形式应该是101B,1/256应该是2^-8,所以X应该是

posted on 2019-09-11 11:19  绿茵好莱坞  阅读(1020)  评论(0编辑  收藏  举报

导航