现在,一般都是采用的IEEE 754标准。float类型的数占32位。对于一个浮点数可以分解成3个部分(符号,指数,尾数),为了书写简便,下面对于这3部分我分别用s,e,f来表示。浮点数从最高位到最低位是这样表示的
s(1位),e(8位),f(23位) .浮点数大小是
(-1)^s * 2^(e-127) * 1.f
在IEEE 745标准中:
1。符号位s,如果是0则为正;否则是1则为负.
2。指数e有一个
偏移量127,所以实际指数还要减去127。如果指数部分位1000 0000(10进制数128),那么实际指数应该是1(128-127)。
3。最后面的23位全部为尾数,即2进制中的小数部分。
下面在说一下它的一些要注意的地方:
1。IEEE 745标准中式严格区分正0和负0的,不过一般的C库是不区分的。不是经常有人说要判断浮点数f是不是0,要这样 (f < 10^-6) && (f> -10^6),那是因为0也有正负。但实际中并不要这样,基本上所有的C库都是不分正负0的,很多人对IEEE的区分正负0都感到质疑。
2。通常的C库中的0的表示是:32位全部是0。
3。如果e最大(8位全部为1),此时e=255,它应该实际表示的指数是255-127=128.不过在这个标准中它有其他的意义:
3.1
e=255,f=0(f的23位全部为0),此时表示的是INF,是正无穷大还是负无穷大由符号位s决定。
3.2
e=255, f!=0(f的23位不全部为0),此时表示的是NaN。IEEE 标准中的NaN是有两类,一类是和算术有关,一类是和信号有关。不过通常的C库不区分的。
4。如果e最小(8位全部为0),此时e=0,它应该实际表示的指数是0-127=-127,标准中规定了这不是一个规范的浮点数,但它也是合法的(只是整数部分为0)。
从上面4点我们可以知道(只考虑正数,负数只是关于0对称),
最大的实际指数是127(128有其他意义),所以最大的一个float数
Fmax=1.111... * 2^127。 其中1.111...小数部分有23个1,表示的是一2进制数
最小的实际指数是-126(-127并不规范),所以最小的一个float数
Fmin=1.000... * 2^-126。 其中1.000...小数部分有23个0,表示的是一2进制数
由此float数的表示范围是
[-Fmax , -Fmin] 和
0 和
[Fmin , Fmax].
把其中的Fmax化成10进制数是
127 * lg 2 (差不多就是 3.4*10^38)
对于float数的精度(也就是小数点后面的位数)应该是:
lg ( 2^23) = 23 * lg 2(差不多就是7)【应为float数尾数有23位】。
[
本帖最后由 Windy0Winll 于 2010-9-7 20:56 编辑 ]