简介
二进制浮点数算术标准(IEEE 754)是由电气电子工程师学会在1985年提出的关于浮点数运算的技术标准,称为IEEE 754-1985。IEEE 854则是IEEE在两年后提出的与基数无关浮点数运算的技术标准,称为IEEE 854-1987。2008年8月,IEEE 754-2008发布,是目前使用的最新版本,其中几乎包括所有IEEE 754-1985规定的标准和IEEE 854-1987内容。相对应的国际标准为ISO/IEC/IEEE 60559:2011。
早期各计算机公司不同型号的计算机有着各自千差万别的浮点数表示方式,这给不同机器间数据交换和协同工作造成了极大的不便。1980年,英特尔发布Intel 8087 数学辅助处理器用于加速应用程序有关浮点运算的运算需求。之后IEEE以8087的浮点表示法和运算规范为标准提出了IEEE 754。现在许多FPU(floating point units)都支持此标准。
规范
规范中定义的内容包括
- 表示方式,包括二进制和十进制浮点数的有限值、无穷值(Inf)和非数值(NaN)的表示方式
- 转换规范,将浮点数转换为定长bit-string
- 运算过程中的舍、入规范
- 算术运算和其他运算相关的规范
- 异常处理,如除数为0时如何处置
- 其他建议
规定有限浮点数使用下方格式表示
(−1)^s × c × b^q
- s为符号位,1为负数,0正数
- c为有效数字
- b为基数,2或10
- q为指数
规范规定5种基本浮点数表示方式,其中称为binary32的单精度浮点数,对应c中的float,占用32bit,规定这32bit表示方式
- 符号位s为最高位,占1位,1为负数,0正数
- 指数q紧跟s,占8位
- 余下23位为有效数字c
binary64,双精度浮点数,对应c中的double,q为11位(范围-1022~1023),c为52位
例
数字-5,二进制为-101,使用规定格式表示为(-1)^1\*1.01\*2^2
,因此s=1, q=2, c=1.01,初步确定完整32位为
1|0,000,001,0|10,100,000,000,000,000,000,000
有效数字c
因为在二进制中,其最高位总是1(若0总可以通过几次指数q-1转为1),因此规范规定表示时省略有效数字的第一位而直接由第二位开始记录,读取时则自动补上1。因此虽然留给有效数字23位,但实际可表示24位内容。如例中,完整32位应改为
1|0,000,001,0|01,000,000,000,000,000,000,000
指数q
8位的q为无符号整数,可以表示的范围是0-255,但指数可能出现负数。IEEE 754规定固定偏移值2^(q-1)-1
,对于binary32即127。计算时,8位q计算出的结果都需要减去127,之后的值是实际的指数,实际范围-127~128;其中又有特例
- q非全0或非全1,使用以上规则
- q全0,最小的指数,也就自然用于表示无穷小以及其极限0,此时有效数字c在读取时不补上1(理解:若有效数字c全为0则表示0,此时要是补1不合适),q则为0-127+1=-126(理解:+1因为有效数字实际是补了0,即0.xxx,小数点左移1位,因此指数+1)
- q全1,最大的指数,若此时有效数字c全为0则表示无穷大,正负则由s决定;若c不全为0,则表示NaN
例中转换时q应进行操作2+127=129,最终32位应改为
1|1,000,000,1|01,000,000,000,000,000,000,000