计算机中的浮点数

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

浮点数

1. 什么是浮点数

在计算机系统的发展过程中,曾经提出过多种方法表达实数。典型的比如相对于浮点数的定点数(Fixed Point Number)。在这种表达方式中,小数点固定的位于实数所有数字中间的某个位置。货币的表达就可以使用这种方式,比如99.00 或者00.99 可以用于表达具有四位精度(Precision),小数点后有两位的货币值。由于小数点位置固定,所以可以直接用四位数值来表达相应的数值。SQL 中的NUMBER 数据类型就是利用定点数来定义的。还有一种提议的表达方式为有理数表达方式,即用两个整数的比值来表达实数。

定点数表达法的缺点在于其形式过于僵硬,固定的小数点位置决定了固定位数的整数部分和小数部分,不利于同时表达特别大的数或者特别小的数。最终,绝大多数现代的计算机系统采纳了所谓的浮点数表达方式。这种表达方式利用科学计数法来表达实数,即用一个尾数(Mantissa,尾数有时也称为有效数字——Significand;尾数实际上是有效数字的非正式说法),一个基数(Base),一个指数(Exponent)以及一个表示正负的符号来表达实数。比如123.45 用十进制科学计数法可以表达为1.2345 ×102 ,其中1.2345 为尾数,10 为基数,2 为指数。浮点数利用指数达到了浮动小数点的效果,从而可以灵活地表达更大范围的实数。

2. IEEE 浮点数

计算机中是用有限的连续字节保存浮点数的。在IEEE 标准中,浮点数是将特定长度的连续字节的所有二进制位分割为特定宽度的符号域,指数域和尾数域三个域,其中保存的值分别用于表示给定二进制浮点数中的符号,指数和尾数。这样,通过尾数和可以调节的指数(所以称为"浮点")就可以表达给定的数值了。

IEEE 754 指定:

n 两种基本的浮点格式:单精度和双精度。

Ø IEEE 单精度格式具有24 位有效数字精度,并总共占用32 位。

Ø IEEE 双精度格式具有53 位有效数字精度,并总共占用64 位。

n 两种扩展浮点格式:单精度扩展和双精度扩展。此标准并未规定这些格式的精确精度和和大小,但它指定了最小精度和大小。例如,IEEE 双精度扩展格式必须至少具有64 位有效数字精度,并总共占用至少79 位。

具体的格式参见下面的图例:

3. 浮点格式

浮点格式是一种数据结构,用于指定包含浮点数的字段、这些字段的布局及其算术解释。浮点存储格式指定如何将浮点格式存储在内存中。IEEE 标准定义了这些格式,但具体选择哪种存储格式由实现工具决定。

汇编语言软件有时取决于所使用的存储格式,但更高级别的语言通常仅处理浮点数据类型的语言概念。这些类型在不同的高级语言中具有不同的名称,并且与表中所示的IEEE 格式相对应。

IEEE 精度

C、C++

Fortran (仅限SPARC)

单精度

float

REAL 或REAL*4

双精度

double

DOUBLE PRECISION 或REAL*8

双精度扩展

long double

REAL*16

IEEE 754 明确规定了单精度浮点格式和双精度浮点格式,并为这两种基本格式分别定义了一组扩展格式。表中显示的long double 和REAL*16 类型适用于IEEE 标准定义的一种双精度扩展格式。

3.1.单精度格式

IEEE 单精度格式由三个字段组成:23 位小数f ;8 位偏置指数e ;以及1 位符号s。这些字段连续存储在一个32 位字中(如下图所示)。

Ø 0:22 位包含23 位小数f,其中第0 位是小数的最低有效位,第22 位是最高有效位。

IEEE 标准要求浮点数必须是规范的。这意味着尾数的小数点左侧必须为1,因此我们在保存尾数的时候,可以省略小数点前面这个1,从而腾出一个二进制位来保存更多的尾数。这样我们实际上用23 位长的尾数域表达了24 位的尾数。

Ø 23:30 位包含8 位偏置指数e,第23 位是偏置指数的最低有效位,第30 位是最高有效位。

8 位的指数为可以表达0 到255 之间的256 个指数值。但是,指数可以为正数,也可以为负数。为了处理负指数的情况,实际的指数值按要求需要加上一个偏差(Bias)值作为保存在指数域中的值,单精度数的偏差值为127;偏差的引入使得对于单精度数,实际可以表达的指数值的范围就变成-127 到128 之间(包含两端)。在本文中,最小指数和最大指数分别用emin 和emax 来表达。稍后将介绍实际的指数值-127(保存为全0)以及+128(保存为全1)保留用作特殊值的处理。

Ø 最高的第31 位包含符号位s。s为0表示数值为正数,而s为1则表示负数。

3.2.双精度格式

IEEE 双精度格式由三个字段组成:52 位小数f ;11 位偏置指数e ;以及1 位符号s。这些字段连续存储在两个32 位字中(如下图所示)。在SPARC 体系结构中,较高地址的32 位字包含小数的32 位最低有效位,而在x86体系结构中,则较低地址的32-位字包含小数的32 位最低有效位。

如果用f[31:0] 表示小数的32 位最低有效位,则在这32 位最低有效位中,第0 位是整个小数的最低有效位,而第31 位则是最高有效位。在另一个32 位字中,0:19 位包含20 位小数的最高有效位f[51:32],其中第0 位是这20 位最高有效位中的最低有效位,而第19 位是整个小数的最高有效位;20:30 位包含11 位偏置指数e,其中第20 位是偏置指数的最低有效位,而第30 位是最高有效位;最高的第31 位包含符号位s。

上图将这两个连续的32 位字按一个64 位字那样进行了编号,其中

Ø 0:51 位包含52 位小数f,其中第0 位是小数的最低有效位,第51 位是最高有效位。

IEEE 标准要求浮点数必须是规范的。这意味着尾数的小数点左侧必须为1,因此我们在保存尾数的时候,可以省略小数点前面这个1,从而腾出一个二进制位来保存更多的尾数。这样我们实际上用52 位长的尾数域表达了53 位的尾数。

Ø 52:62 位包含11 位偏置指数e,第52 位是偏置指数的最低有效位,第62 位是最高有效位。

相关文档
最新文档