浮点数不能判等研究.docVIP

  • 16
  • 0
  • 约6.11千字
  • 约 10页
  • 2021-04-09 发布于广东
  • 举报
浮点数不能判等研究 摘要:在软件开发过程屮,浮点数的表示和运算一直是重点也是难 点。基于日前计算机界广泛使用的TEEE754浮点标准,针对C/C++语言中 “浮点数为什么不能判等”这个典型问题进行了分析和研究,力求给软件 开发及测试人员一个清晰的阐述,研究中得出了两个有趣的结论。 关键词:软件;编程准则;浮点数;IEEE754 中图分类号:TP301 文献标识码:A 文章编号:1672-7800 (2014) 003-0046-03 0引言 国军标5369中,明确提出“禁止对实数类型的量做是否相等的比较”。 至于为什么不能进行浮点数判等,很少有软件设计人员真正明白其深层原 因。工程实践中,往往有许多软件开发者会不小心忘记这条强制性编码准 则,在编制程序时出现错误,从而导致了意想不到的严重后果。 1典型案例描述 某软件中有如下违背该准则的代码: 经调试发现,程序并未执行软件编码人员意想之屮的flag=l的分支, 而是执行了 flag二2的分支。 2浮点不能判等原因分析 为什么浮点数不能直接判等?这与浮点数的表示方法、范围和精度、 舍入方式有关,而这些随计算机所遵循的浮点运算标准的不同而不同。 2. 1 IEEE754 标准 任何数据在计算机内存中都以二进制形式顺序存储,每一个1或0被 称为1位,一个字节是8位。比如一个16位的short int型变量的值是 3000,那么它的二进制表达式10111000c而对于浮点数,同 样的数值可以有多种表达方式,比如213. 14可以表达为21.314X10K 2. 1314X102或者0. 21314X103,小数点的浮动使得数值的表示不能惟一, 从而给数据处理带来困难。 为便于软件移植,浮点数的表示格式应该冇统一标准。1985年IEEE (Ins titute of Electrical an d El ectronics Eng in eers) 提出了 TEEE754 标准。目前绝大部分C/C++编译器都遵照该标准进行浮点运算。 2. 2浮点数表示 IEEE754标准采用科学计数法,用符号位、阶码和尾数来表示一个浮 点数,它规定底数为2,即把浮点数表示成尾数乘以2的阶码次方再添上 符号位,阶码采用移码表示,尾数采用原码表示。 标准中几种典型的浮点数格式如表1所示。前两种数据类型正好对应 C/C++语言中的float和double精度类型,或者FORTRAN语言中的real 和double精度类型。限于篇幅,本文仅对单精度和双精度这两种常用的 浮点格式进行介绍。 下面讨论浮点代码与其真值的关系。浮点类型数据在内存中的存储格 式如图1所示。对于单精度数,最高位(bit31)是符号位S,其后8位 (bit30-bil23)是阶码E,其余23位(bit22-bit0)是尾数M。对于双 精度数,最高位(bit63)是符号位S,其后11位(bit62-bit52)是阶码 E,其余52位(bit51-bit0)是尾数M。 英中,E为浮点代码中的阶码,M为尾数,bias为阶码的偏置值。阶 码为移码形式,因而阶码的真值为:阶码-阶码偏置。对于单精度数,阶 码偏置为127 (2 (8-1) -1),阶码1?254分别对应的阶码真值是-126- +127。对于双精度数,阶码偏置为1023 (2 (11-1) -1),阶码1?2046分 别对应的阶码真值是-1022?+1023。在IEEE754标准中,阶码全为0以及 全为1被保留用作特殊处理,本文不讨论标准中定义的这些特殊值。文中 介绍的浮点数,其阶码为正常值,因而均属于规格化浮点数。尾数为原码 形式,根据原码的规格化方法,最高数字位总是1, TEEE754标准采用隐 含尾数最高数位1的方法,将这个1缺省存储,使得尾数表示范围比实际 存储多一位。应注意尾数隐含的1是一位整数(即位权为20),浮点格式 表示出来的尾数是纯小数并为原码形式,因而尾数的真值为:1+尾数。接 下来通过两个例了进一步阐述浮点数表示。文屮的(data) 10代表I?进制 数data, (data) b代表二进制数data0例1:若采用IEEE短实数格式, 试求出32位浮点数代码0xCC968000的真值。解:将十六进制码转换成二 进制浮点代码形式:b 00101101000000000000000由于符号位 S是1,所以该数为负数。阶码真值二 b- (127) 10= (153) 10-( 127) 10二(26) 10 尾数真值=1+(0.b二 1+ (2-3+2-5+2-6+2-8) 10=1+ (0. 10= ( 1. 10 故该浮点数的真值为-226X 1.

文档评论(0)

1亿VIP精品文档

相关文档