读书频道 > 网站 > 网页设计 > 计算机组成与操作系统
2.1.2 浮点数的表示
15-11-02    下载编辑
收藏    我要投稿   

本文所属图书 > 计算机组成与操作系统

本书突出内容全面、习题和例题丰富的特色,适应国际计算机教育发展的新要求,强调培养计算机相关专业大学生对计算机系统的全面认知与设计开发能力。本书全面系统地介绍了计算机组成与操作系统的基本原理和基本概立即去当当网订购

1.浮点数的基本表示方法

实际工作中,我们遇到的数据往往是带有小数点的。例如,圆周率π是3.1415926,某人的体重是67.5千克,等等。但是,截至目前,我们研究出来的计算机能够直接处理的数只是定点数,要么是定点小数,要么是定点整数。

如何用定点数来表示小数点位置“浮动的”实际数据—浮点数(Float-Point Number)呢?这就是摆在早期计算机科学工作者面前的一个实际问题。

解决这个问题的思路很简单,就是把它转换成易于机器实现的定点数来表示。问题的答案就是数学家早就提出的科学记数法(Scientific Notation)。

采用科学记数法,浮点数N将被表示成N=M×RE。其中M称为尾数(Mantissa或Significant),是一个带小数点的实数;R称为基值(Radix),是一个常整数;E称为阶码(Exponent),是一个整数。

在计算机中,基值R一般取为2,也有取8或16,它是在设计、制造计算机系统时确定的,编码时隐藏(也称为缺省),不出现在编码中。所以计算机中的浮点数由阶码E和尾数M两部分组成,如图2-1所示。其中尾数M采用带符号位的定点小数表示,阶码E采用带符号位的定点整数表示。


 

浮点数的符号就是尾数的符号(简称尾符Ms)。尾符为0,浮点数为正数;尾符为1,浮点数为负数。表示尾数绝对值的位数n决定了浮点数的精度。n越大,浮点数的有效数字就越多。尾数可以用原码、补码或者反码表示。

设表示阶值的位数为m,它与阶符Es共同决定了浮点数绝对值的大小。在尾数一定的情况下,阶码每加1或减1,浮点数的绝对值就增加为原先的R倍或减少为原先的1/R,R为基值。为了便于比较大小,浮点数的阶码通常以移码形式表示的。

为了充分利用尾数所占的二进制数位来表示最多的有效数字,浮点数尾数一般都采用“规格化形式(Normalized Form)”。所谓“规格化形式”,是指尾数绝对值的最高位(第一位)必须为1,也就是说尾数绝对值的必须大于或等于1/R,这样尾数就有n个有效数字了。

事实上,计算过程中的浮点数不一定符合“规格化”的要求,这就需要移动尾数小数点的位置,以保证最终结果是规格化的。尾数的小数点每向左/向右移动1位,就应该给阶码加1或者减1,以保证浮点数的数值不变。这个处理称为“规格化(Normalizing)”。

“规格化”不仅使浮点数具有尽可能多的有效数字,还可确保浮点数的表示具有唯一性。

由于机器数的小数点位置是默认的(即固定的),所以只能通过移动尾数来实现“规格化”。“规格化”在计算机内部的操作就是:尾数每向左/向右移动1位,阶码就减1/加1。

在规格化的过程中,当浮点数的阶码小于最小阶码时,称发生“下溢(Underflow)”。这时阶码(采用移码表示)为全0,又由于发生“下溢”的浮点数的绝对值很小,所以机器强制把尾数置成全0,这样的浮点数称为机器零。即除符号位外,该浮点数的阶码和尾数都是0,便于实现“判断一个数是否为零”。机器零是一个合法的浮点数编码,尽管它不符合规格化表示的要求。

当浮点数的阶码“大于最大阶码”,即全1的阶码(采用移码表示)在加1后变成了全0,计算结果的绝对值超出了定长的浮点数所能表示的最大绝对值,称发生“上溢(Overflow)”。
总之,浮点数的溢出是由阶码溢出导致的。发生“下溢”时,浮点数被置成机器零,机器正常运行,不认为出错。发生“上溢”时,机器认为发生“溢出”错误,将停止运算,发出“中断处理”请求信号。

设浮点数表示格式中:基值为R,有1位尾符,尾数绝对值的位数为n,阶值的位数为m。则可表示的最小尾数值为1/R,最大尾数值为1-2-n,最小阶码值为-2m,最大阶码值为2 m-1;可表示的最小正数为1/R ×R -2m,最大正数为(1-2-n)×R 2m-1,最大负数为,最小负数为-(1-2-n)×R2m-1;可表示的规格化尾数个数为;加上不同符号、不同阶码的表示和机器零,可表示浮点数的个数为

综上所述,采用科学记数法不仅解决了“在只支持定点数的计算机中,实现浮点数的表示与运算”问题,还极大地扩大了计算机的表数范围和表数精度(相对于同样机器字长的定点数)。浮点数的表数范围和溢出情况分布如图2-2所示。


 

上述浮点数表示法所表示的数据是离散的实数。由于浮点数表示法本质上是编码表示,所以与定点数表示法相比,它只是扩大了表示数据的范围,并没有增加表示数据的个数。

计算机总是用定长的二进制数位来表示一个数据,浮点数也不例外。通常,浮点数的表示长度有32位和64位两种。为了区分,称32位的浮点数为实数(Real Number)或单精度(Single-Precision)浮点数,称64位的浮点数为长实数(Long Real Number)或双精度(Double-Precision)浮点数。

至于在32位或64位中,尾数绝对值的位数n和阶值的位数m各占多少,这就需要计算机体系结构的设计者权衡表数精度和表数范围的需求,综合划分了。

【例2-6】 下列关于机器零的说法,正确的是_。

A.两个相等的整数相减的结果就是机器零。

B.计算机使用“000…000”来唯一地表示机器零。

C.机器零有“+0.0”和“-0.0”之分。

D.计算机可以表示的最小的浮点数是机器零。

答:机器零是浮点数意义下的一个概念,不适用于定点整数或定点小数。两个相等整数相减的结果是零,而不是机器零,故A错。计算机可表示的最小浮点数通常是一个规格化的浮点数,故D错。发生“下溢”时,机器只是强制把尾数置成全0,并不改变尾符(数符),故机器零有“+0.0”和“-0.0”之分,所以B是错误的。正确的是C。

【例2-7】 下列关于浮点数基数的说法,错误的是_。

A.当基数为8时,阶码变化1,尾数移动3位

B.在长度相同的情况下,基数越大,所能表示数的个数越多

C.在长度相同的情况下,基数越大,所能表示数的精度越高

D.在长度相同的情况下,基数越大,所能表示数的范围越大

答:在长度相同的情况下,基数越大,所能表示数的个数越多、所能表示数的范围越大,但是所能表示数的精度降低。所以,C是错的。

2.以不同码制表示的浮点数

为了便于算术运算的实现,有的计算机中浮点数的尾数是以补码形式表示的。这时,规格化浮点数的形式有所改变:尾符(即数符)为正时,尾数绝对值的最高位必须为1,否则为0。也就是说,当尾符与尾数绝对值的最高位相反时,尾数以补码形式表示的浮点数是规格化的。

【例2-8】 下列关于浮点数的说法,错误的是_。

A.无论基数取何值,当尾数(以原码表示)小数点后第一位不为0时即为规格化

B.当补码表示的尾数的最高位与尾数的符号位(数符)相反时表示规格化

C.在长度相同的情况下,定点数所表示数的范围要低于浮点数所表示数的范围

D.由于在浮点数的运算中需要比较阶码的大小,所以阶码通常用移码表示

答:基数取2时,尾数(以原码表示)小数点后第一位不为0时即为规格化;取4时,小数点后2位不为00时即为规格化。依此类推。故A是错误的,B、C和D皆正确。

【例2-9】 设机器字长为16,请将-26分别表示成二进制定点数和规格化的浮点数。其中浮点数的阶码占5位(含一位阶符),尾数占11位(含一位数符)。

解:设X=-26=-11010B

采用科学记数法表示成:X=-0.11010B×20101B。

所以,按照定点整数的编码格式,X表示为:

[X]原=1,000000000011010,[X]补=1,111111111100110,[X]反=1,111111111100101。

按照规格化浮点数的编码格式,X表示为:

[X]原=0,0101;1.1101000000,[X]补=0,0101;1.0011000000,[X]反=0,0101;

1.0010111111。

【例2-10】 请写出-53/512对应的、分别用原码和补码表示的规格化浮点数(设浮点数格式同上例,阶码用移码表示)。

解:-53/512=-0.000110101B=(-0.110101B)×2-11B

用原码表示的尾数为:1. 1101010000,用补码表示的尾数为:1. 0010110000。

用原码表示的阶码为:1, 0011,用补码表示的阶码为:1, 1101,用移码表示的阶码为:0, 1101。

因此,对应的尾数用原码表示的规格化浮点数为:0, 1101;1. 1101010000;

对应的尾数用补码表示的规格化浮点数为:0, 1101;1. 0010110000。 
 
【例2-11】 设机器字长为16,基值R为2的浮点数有1位阶符和1位尾符,阶值的位数m为4,尾数绝对值的位数n为10。请分别求出尾数以原码表示和以补码表示时,规格化的浮点数所能表示的最大正数、最小正数、最大负数和最小负数。当阶码用补码或移码表示时,规格化的浮点数所能表示的最大正数、最小正数、最大负数和最小负数会有何变化?

答:尾数以原码表示和以补码表示时,规格化的浮点数所能表示的最大正数、最小正数、最大负数和最小负数如表2-2所示。其中,以补码表示时,尾数“-2-1”(即-R-1)的表示形式为1.1000000000,不满足规格化浮点数的要求,所以绝对值最小的尾数是只能紧邻“-2-1”的另外一个有效负尾数-(2-1+2-10),即-(R-1+R-n)。

另外,以补码表示时,尾数“-1”的表示形式为1.0000000000,满足规格化浮点数的要求。


 

 阶码用补码表示时,规格化的浮点数所能表示的最大正数和最小负数不变,最小正数和最大负数会因阶码的最小值由为-15[即-(2 m-1)]变为-16(即-2m )而发生改变。

最小正数变为1,0000; 0.1000000000,对应真值为2-1×2-16

最大负数变为1,0000; 1.0111111111,对应真值为-(2-1+2-10)×2-16

阶码用移码表示时,规格化的浮点数所能表示的最大正数、最小正数、最大负数和最小负数与阶码用补码表示时相同。

3.浮点数表示的工业标准—IEEE 754标准

从本质上说,浮点数的表示涉及尾数的长度、阶码的长度和阶码的基值这三个主要问题。早期不同的机器在浮点数表示的这三个问题上的选择是不一样的,而且在发生一些特殊情况下缺乏对软件处理的支持。

美国电气与电子工程师协会IEEE(Institute of Electrical and Electronic Engineers)为了便于软件的移植,为采用软件对浮点数运算时发生特殊情况进行处理提供支持,并鼓励开发出面向数值计算的优秀程序,于1985年推出了“浮点数表示及运算标准”,即IEEE 754标准 。目前几乎所有的微处理器都采用这一标准。

由于该标准的成功,它的设计者Kahan因此荣获了1989年的图灵奖。

在IEEE 754标准中,浮点数的最高位为尾数符号位S,然后次高位字段为以移码表示的阶码E,低位字段为尾数F(F=b0b1b 2…b P-1),其中P为尾数的位数,基值为2。

1985年发布的标准有以下四种格式的浮点数:

1)基本的单精度格式(也称为短实数):E占8位,F占23位,共32位;

2)基本的双精度格式(也称为长实数):E占11位,F占52位,共64位;

3)扩充的单精度格式:E≥11位,F≥31位;

4)扩充的双精度格式:E≥15位,F≥63位。

目前在计算机上广泛采用的是基本的单精度与双精度格式。单精度格式的阶码E的表数范围在1~254之间(偏移127),对应的实际阶码值在-126~+127之间。双精度格式的阶码的表数范围在1~2046之间(偏移1023),对应的实际阶码值在-1022~+1023之间。当同时出现最小的尾数(全0)和最小的阶码Emin(全0)时,对应的浮点数表示0,这样使得0有了精确的表示,也使得0的判断易于实现。

IEEE 754标准 还引入了“隐藏位技术”,即规定:规格化尾数在小数点前隐藏一个“1”。这样的好处是:尾数的有效数字增加一位,即对于基本的单精度与双精度格式,它们尾数的有效数字分别是24位和53位。因此,绝对值最小的规格化数分别为±2-126和±2-1022(对应E=1,F=0),绝对值最大的规格化数分别为±(2-2-23)×2127和±(2-2-52)×21023

IEEE 754标准有五种实体(如表2-3所示):1)正/负零;2)非规格化浮点数;3)规格化浮点数;4)正/负无穷大;5)非数NaN(Not a Number)。其中,当阶码E等于最大的阶码Emax(为全1),F为全0时,所表示的数为无穷大(∞),符号由符号位S决定。S=0为+∞,S=1为-∞。当阶码E=Emax,尾数却不是0,表示的是一个“NaN”。


 

“非数”是Kahan的一个创新,其功能是:当浮点运算发生一些特殊情况时,软件可以根据“非数”的内容进行相应的处理,以减少特殊情况下的软件处理工作量。

“非数”有“发信号的非数(Signaling NaN)”和“静默的非数(Quiet NaN)”两种,其中“发信号的非数”在出现无效运算时将发出异常信号,“静默的非数”只记录发生的特殊情况而不发出异常信号。当出现形如(+∞)±(-∞)、0×∞、0÷0、∞÷∞、(当x<0时)等特殊情况时,将产生“静默的非数”。

“非数”的有效部分是尾数,用于区分“发信号的非数”和“静默的非数”,并指明各种异常条件。不过标准对这部分的内容没有定义,不同的实现方案可有不同的尾数。

为了避免出现下溢,IEEE 754标准允许用非规格化形式表示绝对值很小的数,即允许阶码E为全0(对于基本的单精度/双精度格式,相当于实际阶码为-126/-1022),而尾数F不等于0。这种非规格化形式也叫“逐渐下溢(Gradual Underflow)”,这时小数点前就不存在那位隐含的“1”,而只是0。

“逐渐下溢”的引入,使IEEE 754标准的表数能力得到增强。对于基本的单精度格式,在±2-126~0之间分别均匀地补入了2×223个数,对于基本的双精度格式,在±2-1022~0之间分别均匀地补入了2×252个数。相反,如果只允许采用规格化数形式,则在绝对值最小的规格化数与0之间就不存在任何可表示、可区分的数了。

【例2-12】 (2010年硕士研究生入学统一考试 计算机专业基础综合考试试题)

假定C程序中,变量i、f和d数据类型分别为int、float和double(C语言中,int用补码表示,float和double分别用IEEE 754单精度和双精度浮点数据格式表示),已知i=785,f=1.5678e3,d=1.5e100。若在32位机器中执行下列关系表达式,则结果为真的是_。

(Ⅰ)i==(int)(float)i (Ⅱ)f==(float)(int)f (Ⅲ)f==(float)(double)f  (Ⅳ)(d+f)-d==f

A.仅Ⅰ和Ⅱ B.仅Ⅰ和Ⅲ  C.仅Ⅱ和Ⅲ  D.仅Ⅲ和Ⅳ

答:在32位机器上,int型和IEEE 754单精度浮点数都占32位,双精度浮点数占64位。所以(Ⅰ)中,整数785先转换成float型,然后再转换回来,值保持不变。故(Ⅰ)执行结果为真。同理,(Ⅲ)执行结果为真。

(Ⅱ)中,1.5678e3转换成整型数据,将丢失精度,再转换回float型,值就发生变化。故(Ⅱ)执行结果为假。

(Ⅳ)中,左侧的操作数将提升双精度浮点数,结果也是双精度浮点数,而右侧的数据仍然为单精度浮点数,肯定不相等。故选择B。

【例2-13】 (2011年硕士研究生入学统一考试 计算机专业基础综合考试试题)

float型数据通常采用IEEE 754单精度浮点数格式表示。若编译器将float型变量x分配在一个32位浮点寄存器FR1中,且x=-8.25,则FR1的内容是_。

A. C104 0000H B. C242 0000H  C. C184 0000H  D. C1C2 0000H

答:IEEE 754标准的单精度浮点数格式:1位数符、8位阶码、23位尾数。

 x=-8.25=(-1)11000.01B
=1,0111 1111, 1000.0100 0000 0000 0000 0000B
=1,1000 0010, 1 .0000 1000 0000 0000 0000 000B
=1,100 0001 0, 000 0100 0000 0000 0000 0000B
=C1040000H

故选A。


 

【例2-16】 (2014年硕士研究生入学统一考试 计算机专业基础综合考试试题)

float变量通常采用IEEE 754单精度浮点格式表示。假定两个float变量x和y分别存放在32位寄存器f1和f2中,若(f1)=CC90 0000H,(f2)=B0C0 0000H。则x和y之间的关系为_。

A. x<y且符号相同  B. x<y且符号不同
C. x>y且符号相同  D. x>y且符号不同

答:x=1100 1100 1001 0000 0000 0000 0000 0000B,

y=1011 0000 1100 0000 0000 0000 0000 0000B。

根据754单精度浮点格式,x=1,10011001. 001 0000 0000 0000 0000 0000B,

y=1,01100001.100 0000 0000 0000 0000 0000B。

可见,它们的符号是相同的,都是负数;x的阶码大于y的阶码。所以x的绝对值大于y的绝对值。但是由于它们是负数,所以x<y。故选择A。

【例2-17】 已知C语言程序中,变量i、j和k数据类型分别为int、float和double(int用补码表示,float和double分别用IEEE 754单精度和双精度浮点数据格式表示),它们可以取除了+∞、-∞和NaN以外的任意值。若在32位机器中执行下列关系表达式,则结果恒为真的是_。

(Ⅰ)i==(int)(float)i  (Ⅱ)i==(int)(double)i  (Ⅲ)k==(float)k
(Ⅳ)j==(double)j  (Ⅴ)(j+i)-j==i  (Ⅵ)j==-(-j)

A. Ⅰ、Ⅱ和Ⅲ B.Ⅱ、Ⅲ和Ⅴ  C.Ⅱ、Ⅳ和Ⅵ  D.Ⅲ、Ⅳ和Ⅵ

答:位数长的数据类型向位数短的数据类型转换会丢失精度,而位数短的数据类型向位数长的数据类型则不会。

由于尾数只占字长的一部分,所以int型数据向float型转换时可能丢失有效数位,再回到int型数值可能改变,所以(Ⅰ)不恒为真。

double型占64位,int型数据向double型转换时不会丢失有效数位,再回到int型数值不变,所以(Ⅱ)恒为真。

double型数据向float型转换时可能丢失有效数位,所以(Ⅲ)不恒为真。

float型数据向double型转换时不会丢失有效数位,所以(Ⅳ)恒为真。

C语言中,类型不同的数据在一起运算时,将做类型提升(Type Promotion),转换成相同类型后再运算。(Ⅴ)中int型数据向float型转换时可能丢失有效数位,所以(Ⅴ)不恒为真。

浮点数取负就是简单地将数符取反,所以(Ⅵ)恒为真。故选C。

点击复制链接 与好友分享!回本站首页
分享到: 更多
您对本文章有什么意见或着疑问吗?请到论坛讨论您的关注和建议是我们前行的参考和动力  
上一篇:1.3 功能
下一篇:1.5 小结
相关文章
图文推荐
JavaScript网页动画设
1.9 响应式
1.8 登陆页式
1.7 主题式
排行
热门
文章
下载
读书

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训
版权所有: 红黑联盟--致力于做最好的IT技术学习网站