浮点数的存储格式
基于IEEE 754的浮点数存储格式
IEEE(Institute of Electrical and Electronics Engineers,电气工程师协会)在I985年制定的IEEE 754(IEEE Standard for Binary Floating-Point Arithmetic, ANSI/IEEE Std 754-1985 )二进制浮点运算规范,是浮点运算部件事实上的工业标准。
1 浮点数
在运算机系统的进程中,曾经提出过量种方式表示实数,可是到为止利用最普遍的是浮点表示法。相对于定点数而言,浮点数利用指数使小数点的位置能够按照需要而上下浮动,从而能够灵活地表达更大范围的实数。
浮点数表示法利用计数法来表达实数。通常,将浮点数表示为 ± …d ×βe,其中… d 称为有效数字(significand),它具有 p 个数字(称p位有效数字精度),β为基数(Base),e为指数(Exponent),±表示实数的正负[1,2]。更精准地,± 1d2…dp-1 × βe, 表示以下数
--(-)
±(d0+d1β1+… +dp-1βp1)βe,(0≤di<β=
对实数的浮点表示仅作如上的规定是不够的,因为同一实数的浮点表示还不是唯一的。例如,×102 , ×103 ,和 ×104 都能够表示。为了达到表示单一性的目的,有必要对其作进一步的规范。规定有效数字的最高位(即前导有效位)必需非零,即0<d0<β。符合该标准的数称为规格化数(Normalized Numbers),不然称为非规格化数(Denormalized Numbers)。
2 IEEE 754浮点数与其浮点格式 实数的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]。IEEE 754浮点数的数据位被划分为3个字段,对以上参数值进行编码:
(1)一个单独的符号位s直接编码符号s。
(2)k位的偏置指数e(e=ek-1…e1e0)编码指数E,移码表示。
(3)n位的小数f(fraction)(f=fn-1…f1f0)编码有效数字M,原码表示。
浮点数的分类
按照偏置指数e的值,被编码的浮点数可分成三种类型。 (1)规格化数
当有效数字M在范围1≤M<2中且指数e的位模式ek-1…e1e0既不尽是0也不尽是1时,浮点格式所表示的数都属于规格化数。这种情形中小数f(0≤f<1 ) 的二进制表示为0. fn-
有效数字M=1+f,即M=1. fn-1…f1f0 (其中小数点左侧的数值位称为前导有效位)1…f1f0。
。咱们老是能调整指数E,使得有效数字M在范围1≤M<2中,如此有效数字的前导有效位老是1,因此该位不需显示表示出来,只需通过指数隐式给出。
需要特别指出的是指数E要加上一个偏置值Bias,转换成无符号的偏置指数e,也就是说指数E要以移码的形式在寄存运算机中。且e、E和Bias三者的对应关系为e=E+Bias,
-
其中Bias=2k1-1。
(2)非规格化数
当指数e的位模式ek-1…e1e0全为零(即e=0)时,浮点格式所表示的数是非规格化数。这种情形下,E=1-Bais,有效数字M=f=0. fn-1…f1f0 ,有效数字的前导有效位为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++ float double long double FORTRAN REAL or REAL*4 DOUBLE PRECISION or REAL*8 REAL*16 [仅适用于SPARC和PowerPC] IEEE 754标准准确地概念了单精度和双精度浮点格式,并为这两种大体魄式的别离概念了扩展格式,表1里扩展双精度格式是IEEE标准概念的扩展双精度类中的一种。
下面详细讨论在Intel x86和SPARC平台上利用的三种IEEE浮点存储格式。
单精度格式
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。
双精度格式
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]位。
扩展双精度格式
⑴ 扩展双精度格式(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机中向上计算)别离寄存