1、以32位float为例:计算机中表达浮点数时分为符号(s),指数(e),尾数(f)三部分,当表示32位float时各部分长度分别为:s(1位),e(8位),f(23位) 。浮点数大小是(-1)^s×2^(e-127) ×1.f。
注意:
-
符号位s=1,表示负数;s=0表示负数;
-
指数e为移码方式存储,实际值=存储值-127;
-
尾数f表示了实际数值中的二进制小数部分,整数部分为1。
-
指数e最大值为254,IEEE 745规定当e=255,f=0时表示INF,参考后文(原文摘抄)部分
举例说明:
当s=0,e=128,f=0时,存储值为:0x4000 0000,真实值为1.0×2^(128-127)=2.0
当s=1,e=128,f=0x40 0000时,存储值为:0xC040 0000,真实值为-1.1×2^(128-127)= -3.0
当s=0,e=1,f=0时,存储值为:0x00800000,真实值为:1.0×2^(1-127)=1.175494e-38
当s=0,e=254,f=0x7F FFFF时,存储值为:0x7F7F FFFF,真实值为1.11…1×2^(254-127)=3.402823e+038(最大值)
当s=0,e=255,f=0时,存储值为:0x7F80 0000,真实值为:INF
当s=1,e=254,f=0x7F FFFF时,存储值为:0xFF7F FFFF,真实值为 1.11…1×2^(254-127)=3.402823e+038(最小值)
(原文摘抄)部分指出:IEEE 745规定e=0时为不规范浮点数,故最小的正浮点为:s=0,e=1,f=0时,值为:1.000... * 2^-126。但通过TC2.0和VC6.0中测试发现:当e=0,f≠0时,浮点数值为:0.f×2^-127;当e=0,f=0时表示0.0。
故最接近0点为s=0,e=0,f=1时为1.401298e-045或s=1为-1.401298e-045
总结:
浮点数可以表示小于10e-6数,所以单纯以小于10e-6判断浮点数为0是不太合适的;
2、Double型:最高位63位是符号位,1表示该数为负,0正;62-52位,一共11位是指数位;51-0位,一共52位是尾数位。
类似于float型:
当s=0,e=2046,f=0xF FFFF FFFF FFFF时,存储值为: 0x7FEF FFFF FFFF FFFF,真实值为1.11…1×2^(2046-1023)= 1.797693e+308(最大值)
当s=1,e=2046,f=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 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位】。