二进制小数及 IEEE 浮点表示


1、二进制小数

  前面这篇博客 进制间的转换  我们已经讲过了各个进制数的表示。现在我们复习一下:  

  进位计数制的要素:

    ①、数码:用来表示进制数的元素。比如二进制数的数码为:0,1。十进制数的数码为:0,1,2,3,4,5,6,7,8,9。十六进制数的数码为:0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F

    ②、基数:数码的个数。比如二进制数的基数为2。十进制数的基数为10。十六进制数的基数为 16.

    ③、位权:数制中每一固定位置对应的单位值称为位权。例如十进制第2位的位权为101即10,第3位的位权为102即100;而二进制第1位的位权为20即1,第3位的位权为4,对于 N进制数,整数部分第 i位的位权为N(i-1),而小数部分第j位的位权为N-j

  那么我们可以说:每个数码所表示的数值=该数码值 * 所处位置的位权。

  比如十进制数:(123.45)10=1×102+2×101+3×100+4×10-1+5×10-2

    二进制数:(1010)2 =l× 23+0 × 22+l× 21+0 × 20=(10)10

    十六进制数:(BAD)16 =11× 162+10×161+13×160=(2989)10

   二进制小数(10010.1110)2 = 1 * 2+ 0 * 2+ 0 * 2+ 1 * 21 + 0 * 20 + 1 * 2-1 + 1 * 2-2 + 1 * 2-3 +  0 * 2-4 = 16 + 2 + 1/2 + 1/4 + 1/8 

   总结来说

    十进制表示公式:

    对于一个形式为bm....b0.b-1....b-n的二进制小数b来说,二进制表示公式:

  从上面的二进制公式我们可以看出,小数点向左移动一位,则相当于 (∑ 2* bi)/2。因为每一位的位权都*2-1;反过来,小数点向右移动一位,则相当于该数乘以2。

  注意:二进制小数不像整数一样,只要位数足够,它就可以表示所有整数。假设我们仅考虑有限长度的编码,那么二进制小数无法精确的表示任意小数,比如十进制小数0.2,我们并不能将其准确的表示为一个二进制数,只能增加二进制长度提高表示的精度。

  

2、IEEE 浮点表示

   IEEE,电气和电子工程师协会( 全称是Institute of Electrical and Electronics Engineers)是一个国际性的电子技术与信息科学工程师的协会,是目前全球最大的非营利性专业技术学会,IEEE 754 标准是IEEE二进位浮点数算术标准(IEEE Standard for Floating-Point Arithmetic)的标准编号。

   IEEE 浮点标准表示: V = (-1)s * M * 2E 

  ①、s 是符号位,为0时表示正,为1时表示负。

  ②、M为尾数,是一个二进制小数,它的范围是0至1-ε,或者1至2-ε(ε的值一般是2-k次方,其中设k > 0)

  ③、E为阶码,可正可负,作用是给尾数加权。

   我们将浮点数的位划分为三个阶段,分别对这些值进行编码。

  一、一个单独的符号位 s 直接编码符号 s

  二、k 位的阶码字段 exp =ek-1ek-2...e1e0 编码阶码E

  三、n 位小数字段 frac = fn-1fn-2...f1f0 编码尾数 M,但是编码出来的值也依赖于阶码字段的值是否等于0.

  一般来说,现在的编译器都支持两种浮点格式,一种是单精度,一种是双精度。单双精度分别对应于编程语言当中的float和double类型。其中float是单精度的,采用32位二进制表示,其中1位符号位,8位阶码以及23位尾数。double是双精度的,采用64位二进制表示,其中1位符号位,11位阶码以及52位尾数。如下图表示:

   如果给定了位 s 的表示,根据 exp 的值,被编码的值可以分为三种不同的情况(最后一种情况有两个变种)。下图是单精度的情况:

  下面我们分别讲解这三种情况(规格化、非规格化、特殊值)

   

回到顶部回到顶部回到顶部回到顶部

6、数值范围

  注意:由于浮点数在正负的区间内是一一对应的,因此我们将忽略符号位对取值范围的影响,我们只讨论符号位为0的情况。

  非规格化

  ①、最小的正非规格化值的位表示,是由最低有效位为 1 而其他所有位为 0 构成。它具有小数(尾数)值 M=f=2-n 和阶码值 E= -2k-1+2。因此它的数字值是 V= 2-n * 22 - 2k-1 = 2-n+2 - 2k-1

  ②、最大的非规格化值,全为0的阶码字段和全为1的小数字段组成。此时的小数(尾数)值 M=f=1-2-n,阶码 E=  -2k-1 +2,因此此时的值为 (1 - 2-n) * 22 - 2k-1

  规格化

  ①、最小的正规格化值,阶码字段的最低有效位为1,其它位为0,。它的尾数值 M = 1。阶码值 E= -2k-1 +2。因此数值 V = 22 - 2k-1

  ②、最大的规格化值,符号位为0,阶码最低有效位等于0,其它位等于 1,尾数为n个1。它的小数值 f=1-2-n,尾数 M= 2 - 2-n,此时的值为(2 - 2-n) * 2-1 + 2k-1,也可以化简一下为(1 - 2-n-1) * 22k-1

  下面我们看一下非负浮点数单双精度取值范围: