基于IEEE 754的浮点数存储格式分析研究

导读:
   摘 要 浮点数的表示和存储直接影响计算机的结构和性能,IEEE 754是浮点运算部件事实上的工业标准,是计算机上使用最为广泛的浮点标准。文章在阐述了浮点数的基本概念和IEEE 754浮点数的表示形式及其格式的基础上,比较深入的比较、分析和研究了Intel x86和SPARC结构计算机上使用的三种IEEE浮点数的存储格式。
   关键词 IEEE 754;浮点数;浮点格式;浮点存储格式;规格化
  
   0引言
  IEEE(Institute of Electrical and Electronics Engineers,电子电气工程师协会)在I985年制定的IEEE 754(IEEE Standard for Binary Floating-Point Arithmetic, ANSI/IEEE Std 754-1985 )二进制浮点运算规范,是浮点运算部件事实上的工业标准。许多计算机用户有机会在Intel x86和SPARC 或Power PC机之间交换二进制数据,所以对照Intel x86和SPARC结构计算机的数据表示及相关程序设计语言,讨论IEEE 754浮点数存储格式的细节是有意义的。
  本文对浮点数、IEEE 754浮点数的表示方法、规格化处理等进行了分析,重点分析、比较了Intel x86和SPARC结构计算机IEEE 754浮点数的存储格式。
   1 浮点数
  在计算机系统的发展过程中,曾经提出过多种方法表示实数,但是到目前为止使用最广泛的是浮点表示法。相对于定点数而言,浮点数利用指数使小数点的位置可以根据需要而上下浮动,从而可以灵活地表达更大范围的实数。
  浮点数表示法利用科学计数法来表达实数。通常,将浮点数表示为 ± d.dd…d ×βe,其中d.dd… d 称为有效数字(significand),它具有 p 个数字(称p位有效数字精度),β为基数(Base),e为指数(Exponent),±表示实数的正负[1,2]。更精确地,± d0.d1d2…dp-1× βe, 表示以下数
  ±(d0+d1β-1+… +dp-1β-(p-1))βe,(0≤di<β)。
  对实数的浮点表示仅作如上的规定是不够的,因为同一实数的浮点表示还不是唯一的。例如,1.0×102,0.1 ×103,和0.01 ×104都可以表示100.0。为了达到表示单一性的目的,有必要对其作进一步的规范。规定有效数字的最高位(即前导有效位)必须非零,即0<d0<β。符合该标准的数称为规格化数(Normalized Numbers),否则称为非规格化数(Denormalized Numbers)。
   2 IEEE 754浮点数与其浮点格式
   2.1 实数的IEEE 754表示形式
  一个实数V在IEEE 754标准中可以用V=(-1)s×M×2E的形式表示[3,4],说明如下:
  (1)符号s(sign)决定实数是正数(s=0)还是负数(s=1),对数值0的符号位特殊处理。
  (2)有效数字M(significand)是二进制小数,M的取值范围在1≤M<2或0≤M<1。
  (3)指数E(exponent)是2的幂,它的作用是对浮点数加权。
   2.2 浮点格式
  浮点格式是一种数据结构,它规定了构成浮点数的各个字段,这些字段的布局,及其算术解释[2]。IEEE 754浮点数的数据位被划分为3个字段,对以上参数值进行编码:
  (1)一个单独的符号位s直接编码符号s。
  (2)k位的偏置指数e(e=ek-1…e1e0)编码指数E,移码表示。
  (3)n位的小数f(fraction)(f=fn-1…f1f0)编码有效数字M,原码表示。
   2.3 浮点数的分类
  根据偏置指数e的值,被编码的浮点数可分成三种类型。
  (1)规格化数
  当有效数字M在范围1≤M<2中且指数e的位模式ek-1…e1e0既不全是0也不全是1时,浮点格式所表示的数都属于规格化数。这种情况中小数f(0≤f<1 ) 的二进制表示为0. fn-1…f1f0。有效数字M=1+f,即M=1. fn-1…f1f0(其中小数点左侧的数值位称为前导有效位) 。我们总是能调整指数E,使得有效数字M在范围1≤M<2中,这样有效数字的前导有效位总是1,因此该位不需显示表示出来,只需通过指数隐式给出。
  需要特别指出的是指数E要加上一个偏置值Bias,转换成无符号的偏置指数e,也就是说指数E要以移码的形式在存放计算机中。且e、E和Bias三者的对应关系为e=E+Bias,其中Bias=2k-1-1。
  (2)非规格化数
  当指数e的位模式ek-1…e1e0全为零(即e=0)时,浮点格式所表示的数是非规格化数。这种情况下,E=1-Bais,有效数字M=f=0. fn-1…f1f0,有效数字的前导有效位为0。
  非规格化数的引入有两个目的。其一是它提供了一种表示数值0的方法,其二是它可用来表示那些非常接近于0.0的数。
  (3)特殊数
  当指数e的位模式ek-1…e1e0全为1时,小数f的位模式fn-1…f1f0全为0(即f=0)时,该浮点格式所表示的值表示无穷,s=0 时是+∞,s=1时是-∞。
  当指数e的位模式ek-1…e1e0全为1时,小数f的位模式fn-1…f1f0不为0(fn-1、…、f1、f0、至少有一个非零即f≠0)时,该浮点格式所表示的值被称为NaN(Not a Number)。比如当计算 或∞-∞时用作返回值,或者用于表示未初始化的数据。
   3 IEEE 754浮点存储格式
  与浮点格式对应,浮点存储格式规定了浮点格式在存储器中如何存放。IEEE标准定义了这些浮点存储格式,但具体选择哪种存储格式由实现工具(程序设计语言)决定。
  汇编语言软件有时取决于所使用的存储格式,但更高级的语言通常仅处理浮点数据类型的语言概念。这些浮点数据类型在不同高级语言中有不同的名字,相应的IEEE格式如表1。
  表1 IEEE 格式和语言类型
  IEEE精度 C,C++ FORTRAN
  单精度 float REAL or REAL*4
  双精度 double DOUBLE PRECISION or REAL*8
  扩展双精度 long double REAL*16 [仅适用于SPARC和PowerPC]
  IEEE 754标准准确地定义了单精度和双精度浮点格式,并为这两种基本格式的分别定义了扩展格式,表1里扩展双精度格式是IEEE标准定义的扩展双精度类中的一种。
  下面详细讨论在Intel x86和SPARC平台上使用的三种IEEE浮点存储格式。 

   3.1 单精度格式
  IEEE单精度浮点格式共32位,包含三个构成字段:23位小数f,8位偏置指数e,1位符号s。将这些字段连续存放在一个32位字里,并对其进行编码。其中0:22位包含23位的小数f; 23:30位包含8位指数e;第31位包含符号s。如图1所示。
  
  
  图1 单精度存储格式
  一般地,32位字的第0位存放小数f的最低有效位LSB(the least significant bit),第22位存放小数f的最高有效位MSB(the most significant bit);第23位存放偏置指数的最低有效位LSB,第30位存放偏置指数的最高有效位MSB;最高位,第31位存放符号s。
   3.2 双精度格式
  IEEE双精度浮点格式共64位,占2个连续32位字,包含三个构成字段:52位的小数f,11位的偏置指数e,1位的符号位s。将这2个连续的32位字整体作为一个64位的字,进行重新编号。其中0:51位包含52位的小数f;52:62位包含11位的偏置指数e;而最高位,第63位包含符号位s。如图2所示。
  
  
  图 2 双精度浮点数的存储格式
  f[31:0]存放小数f的低32位,其中第0位存放整个小数f的最低有效位LSB,第31位存放小数f的低32位的最高有效位MSB。
  在另外的32位的字里,第0 到19位,即f[51:32],存放小数f的最高的20位,其中第0位存放这20位最高有效数中的最低有效位LSB,第19位存放整个小数f的最高有效位MSB。第20到30位,即e[52:62],存放11位的偏置指数e,其中第20位存放偏置指数的最低有效位LSB,第30位存放最高有效位MSB。最高位,第31位存放符号位s。
  在Intel x86结构计算机中,数据存放采用小端法(little endian),故较低地址的32位的字中存放小数f的f[31:0]位。而在在SPARC结构计算机中,因其数据存放采用大端法(big endian),故较高地址的32位字中存放小数f的f[31:0]位。
   3.3 扩展双精度格式
  ⑴ 扩展双精度格式(SPARC 结构计算机)
  该4倍精度浮点环境符合IEEE关于扩展双精度格式的定义。该浮点环境的4倍精度浮点格式共128位,占4个连续32位字,包含3个构成字段:112位的小数f,15位的偏置指数e,和1位的符号s。将这4个连续的32位字整体作为一个128位的字,进行重新编号。其中0:110位包含小数f;112:126位包含偏置指数e;第127位包含符号位s。如图3所示。
  在SPARC结构计算机中,地址最高的32位字存放小数的32位最低有效位,即f[31:0];但是在PowerPC结构计算机中,却是地址最低的32位字存放这些位。
  紧邻的两个32位字(在SPARC机中向下计算,在PowerPC机中向上计算)分别存放f[63:32]和f[95:64]。
  最后一个字的第0到15位存放小数的最高16位,即f[111:96]。其中第0位存放该16位的最低有效位,第15位存放整个小数f的最高有效位。第16到30位存放15位的偏置指数e,其中第16位存放偏置指数的最低有效位,第30位存放它的最高有效位。最高位,第31位存放符号s。
  
  
  图 3 扩展双精度存储格式 (SPARC 结构计算机)
  ⑵ 扩展双精度格式(Intel x86结构计算机)
  该浮点环境双精度扩展格式符合IEEE双精度扩展格式的定义。该浮点环境的扩展双精度格式共80位,占3个连续32位字,包含四个构成字段:63位的小数f,1位显式前导有效位(explicit leading significand bit)j,15位偏置指数e,和1位符号位s。将这3个连续的32位字整体作为一个96位的字,进行重新编号。其中0:63包含63位的小数f,第63位包含前导有效位j,64:78位包含15位的偏置指数e,最高位第79位包含符号位s。
  在Intel结构系计算机中,这些字段依次存放在十个连续的字节中。但是,由于 UNIX System V Application Binary Interface Intel 386 Processor Supplement (Intel ABI) 要求双精度扩展参数,从而占用堆栈中3个相连地址的32位字,其中最高一个字的高16位未被使用,如图4所示。
  
  
  图4 扩展双精度存储格式(Intel x86结构计算机)
  地址最低的32位字存放小数f的低32位,即f[31:0]。其中第0位存放整个小数f的最低有效位LSB 第31位存放小数低32位的最高有效位MSB。
  地址居中的32位字,第0到30位存放小数f的31位最高位,即f[62:32]。其中第0位存放31位最高小数位的最低有效位LSB,第30位存放整个小数的最高有效位,地址居中的32位字的最高位第31位存放显式的前导有效位j。
  地址最高32位字里,第0到14位存放15位的偏置指数e,第0位存放偏置指数的最低有效位LSB,第14位存放最高有效位MSB,第15位存放符号位s。虽然地址最高的32位字的高16位在Intel x86结构系列机种未被使用,但他们对符合Intel ABI的规定来说,是必需的。
   4 总结
  以上讨论了Intel x86、Power PC和SPARC平台上使用的三种IEEE 754浮点数格式及其存储格式,下面对浮点数的相关参数进行总结,具体见表2。
  表2 IEEE 浮点格式参数总结
  参数 浮点格式
  单精度 双精度 扩展双精度(Intel x86) 扩展双精度(SPARC)
  小数f宽度n 23 52 63 112
  前导有效位 隐含 隐含 显式 隐含
  有效数字M精度p 24 53 64 113
  偏置指数宽度k 8 11 15 15
  偏置值Bias +127 +1023 +16383 +16383
  符号位宽度 1 1 1 1
  存储格式宽度 32 64 80 128
  参考文献
  [1] David Goldberg with Doug Priest. What Every Computer Scientist Should Know about Floating-Point Arithmetic. http://grouper.ieee.org/
  [2] Sun Corporation.Numerical Computation Guide, pp1-11. http://docs.sun.com
  [3] Randal E.Bryant,David O'Hallaron. Computer Systems Aprogrammer’s Perspective(英文版) [M] .北京:电子工业出版社,2004
  [4]David A. Patterson, John L. Hennessy.Computer Organization &Design: TheHardware/Software Interface. (英文版 第二版) [M] . 北京:机械工业出版社,1999.275~321

本文转自
http://www.studa.net/yingyong/080502/15414593.html
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值