1、以32float为例:计算机中表达浮点数时分为符号(s),指数(e),尾数(f)三部分,当表示32float时各部分长度分别为:s(1)e(8)f(23) 浮点数大小是(-1)^s×2^(e-127) ×1.f

注意

  1. 符号位s=1,表示负数;s=0表示负数;

  2. 指数e为移码方式存储,实际值=存储值-127

  3. 尾数f表示了实际数值中的二进制小数部分,整数部分为1。

  4. 指数e最大值为254IEEE 745规定e=255f=0时表示INF,参考后文(原文摘抄)部分

举例说明:

s=0e=128f=0时,存储值为:0x4000 0000,真实值为1.0×2^(128-127)=2.0

s=1e=128f=0x40 0000时,存储值为:0xC040 0000真实值为-1.1×2^(128-127)= -3.0

s=0e=1f=0时,存储值为:0x00800000,真实值为:1.0×2^(1-127)=1.175494e-38

s=0e=254f=0x7F FFFF时,存储值为:0x7F7F FFFF,真实值为1.11…1×2^(254-127)=3.402823e+038(最大值)

s=0e=255f=0时,存储值为:0x7F80 0000,真实值为:INF

s=1e=254f=0x7F FFFF时,存储值为:0xFF7F FFFF真实值为 1.11…1×2^(254-127)=3.402823e+038(最小值)

 

(原文摘抄)部分指出:IEEE 745规定e=0时为不规范浮点数,故最小的正浮点为:s=0e=1f=0时,值为:1.000... * 2^-126。但通过TC2.0VC6.0中测试发现:当e=0f≠0时,浮点数值为:0.f×2^-127;当e=0f=0时表示0.0

最接近0s=0e=0f=1时为1.401298e-045s=1-1.401298e-045

总结:

浮点数可以表示小于10e-6数,所以单纯以小于10e-6判断浮点数为0是不太合适的;

2、Double型:最高位63位是符号位,1表示该数为负,0正;62-52位,一共11位是指数位;51-0位,一共52位是尾数位。

类似于float型:

s=0e=2046f=0xF FFFF FFFF FFFF时,存储值为: 0x7FEF FFFF FFFF FFFF,真实值为1.11…1×2^(2046-1023)= 1.797693e+308(最大值)

s=1e=2046f=0xF FFFF FFFF FFFF时,存储值为: 0xFFEF FFFF FFFF FFFF,真实值为

1.11…1×2^(2046-1023)= 1.797693e+308(最小值)

 

(原文摘抄)

http://bbs.bccn.net/thread-319321-1-1.html

现在,一般都是采用的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 000010进制数128),那么实际指数应该是1128-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(f23位全部为0)此时表示的是INF,是正无穷大还是负无穷大由符号位s决定。
     3.2
e=255, f!=0(f
23位不全部为0)此时表示的是NaNIEEE 标准中的NaN是有两类,一类是和算术有关,一类是和信号有关。不过通常的C库不区分的。
  4
。如果e最小(8位全部为0),此时e=0,它应该实际表示的指数是0-127=-127,标准中规定了这不是一个规范的浮点数,但它也是合法的(只是整数部分为0)

从上面4点我们可以知道(只考虑正数,负数只是关于0对称)
      
最大的实际指数是127(128有其他意义),所以最大的一个floatFmax=1.111... * 2^127。  其中1.111...小数部分有231,表示的是一2进制数
      
最小的实际指数是-126(-127并不规范),所以最小的一个floatFmin=1.000... * 2^-126。 其中1.000...小数部分有230,表示的是一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位】。

posted on 2011-08-02 10:45  sunnylgz  阅读(528)  评论(1编辑  收藏  举报