浮点概念的引入
在计算机系统的发展过程中,曾经提出过多种方法表达实数。比如定点数表示法, 这种表示方法将小数点的位置固定在某一个位置,比如: 11001000.00110001,这个16位(2字节) 的定点数用前面8位表示整数部分,后面8位表示小数部分,这种方法直观,但是固定的小数点位置决定了固定位数的整数部分和小数部分,不利于同时表达特别大的数或者特别小的数。最终,绝大多数现代计算机遵循IEEE754,即IEEE二进制浮点数算数标准,利用科学计数法来表达实数,即用一个尾数(Mantissa or significand),一个基数(Base),一个指数(Exponent)以及一个表示正负的符号来表达实数。比如 123.45 用十进制科学计数法可以表达为 1.2345 × 10^2 ,其中1.2345 为尾数,10 为基数,2为指数。浮点数利用指数达到了浮动小数点的效果,从而可以灵活地表达更大范围的实数。
浮点数在内存中的格式
IEEE 754标准定义了五种浮点数格式,使用基数和该格式占用的内存比特数命名,五种格式分别为:
- 二进制32位浮点数 (binary32)
- 二进制64位浮点数 (binary64)
- 二进制 128位浮点数(binary128)
- 十进制64位浮点数(decimal64)
- 十进制128位浮点数(decimal128)
各种编程语言和编译器一般都支持前两种格式,分别对应于float和double,对于后一种二进制高双精度128位浮点数,一般编译器使用80位表示,也有极个别的编译器将他们视为128位。
在IEEE标准中,浮点数在内存中的表示是将特定长度的连续字节的所有二进制位按特定长度划分为符号域,指数域和尾数域三个连续域。 例如,对于float类型的数据,其在内存中的表示为:
对于double类型,其表示形式如下:
从上面可以看出,float类型在内存中占用的位数为: 1+8+23=32bits