浮点数知识
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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指定:
⏹两种基本的浮点格式:单精度和双精度。
IEEE单精度格式具有24位有效数字精度,并总共占用32位。
IEEE双精度格式具有53位有效数字精度,并总共占用64位。
⏹两种扩展浮点格式:单精度扩展和双精度扩展。此标准并未规定这些格式的
精确精度和和大小,但它指定了最小精度和大小。例如,IEEE双精度扩展格式必须至少具有64位有效数字精度,并总共占用至少79位。
具体的格式参见下面的图例:
3.浮点格式
双精度扩展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之间(包含两端)。在本文中,最小指数和
最大指数分别用e min和e max来表达。稍后将介绍实际的指数值-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位是最高有效位。
11位的指数为可以表达0到2047之间的2048个指数值。但是,指数
可以为正数,也可以为负数。为了处理负指数的情况,实际的指数值按
要求需要加上一个偏差(Bias)值作为保存在指数域中的值,单精度数
的偏差值为1023;偏差的引入使得对于单精度数,实际可以表达的指数
值的范围就变成-1023到1024之间(包含两端)。在本文中,最小指
数和最大指数分别用e min和e max来表达。稍后将介绍实际的指数
值-1023(保存为全0)以及+1024(保存为全1)保留用作特殊值的
处理。
最高的第63位包含符号位s。s为0表示数值为正数,而s为1则表示负数。
3.3.双精度扩展格式(SPARC)
SPARC浮点环境的四倍精度格式符合双精度扩展格式的IEEE定义。四倍精度格式占用32位字并包含以下三个字段:112位小数f、15位偏置指
数e和1位符号s。这三个字段连续存储,如图2-3所示。
地址最高的32位字包含小数的32位最低有效位,用f[31:0]表示。紧邻的两个32位字分别包含f[63:32]和f[95:64]。下面的0:15位包含小数的16位最高有效位f[111:96],其中第0位是这16位的最低有效位,而第15位是整个小数的最高有效位。16:30位包含15位偏置指数e,其中第16位是该偏置指数的最低有效位,而第30位是最高有效位;
第31位包含符号位s。
下图将这四个连续的32位字按一个128位字那样进行了编号,其
中0:111位存储小数f;112:126位存储15位偏置指数e;而
第127位存储符号位s。