0 背景知识
根据国际标准IEEE 754,任意一个二进制浮点数V可以表示成下面的形式:
V = (-1)^s×M×2^E
(1)(-1)^s表示符号位,当s=0,V为正数;当s=1,V为负数。
(2)M表示有效数字,大于等于1,小于2。因为整数肯定是1,所以保存时忽略1,计算时再加1。
(3)2^E表示指数位。
例如:十进制0.1的二进制为:0.000
110011001100110011001100 11001100...
按照上面规格化要求,改成1.1001100110011001100*2^(-4)
32位浮点float表示0x3DCCCCCC,实际VC编译后对应的是0x3DCCCCCD,应该和无法整除数值的进位取舍有关,对应二进制:0,01111011,10011001100110011001101,其中
符号位:0
指数位:01111011 = -4
2^(-4)=0.0625
尾数为:100 1100 1100 1100 1100 1101 = 5033165/(2^23) = 5033165 / 8388608 =0.6000000238418579
分别将各部分对应的十进制相乘1*0.0625*(1+0.60
00000238418579)=0.10000000149011611875
1 内存分配
每个float类型4字节,double类型8字节,以科学计数法的指数+尾数形式表示,
具体分布如下(高位在前,低位在后):
float(共32位) :1bit(符号位) 8bits(指数位) 23bits(尾数位)
double(共64位):
1bit(符号位)11bits(指数位) 52bits(尾数位)
以float类型为例:0x00000000表示0,0x80000000表示-0,即最高位为符号位
2 范围
float和double的范围是由指数的位数来决定的。
float的指数位有8位,而double的指数位有11位。于是,float的指数范围为-127~+128,而double的指数范围为-1023~+1024,并且指数位float(+127)double(+1023)的形式来表示的(IEEE745)。
以float类型为例,十进制1的float类型指数为01111111(即0+127),2的指数为10000000(即1+127),3也是10000000(即1+127),4为10000001(即2+127)
负指数(小于127)决定了所能表达的绝对值最小的非零数;而正指数决定了所能表达的绝对值最大的数,即范围。
float的范围为-2^128 ~ +2^128,也即-3.40E+38 ~ +3.40E+38;
double的范围为-2^1024 ~ +2^1024,也即-1.79E+308 ~ +1.79E+308。
3 精度
以 IEEE 单精度格式表示的 a 具有多少个有效十进制数字;或者当用户以 IEEE 单精度 格式表示 x 时,可以确信有多少十进制数字是准确的?
有效十进制数字的个数始终介于 6 和 9 之间,即至少有 6 个数字是准确的,但准确数字不会超过 9 个 (如果转换是准确的,则准确数字个数不受此限制,此时可能有无限多个准确数字)。
相反,如果将 IEEE 单精度格式的二进制数转换为十进制数,然后再将其转换回二进制,则通常需要使用至少 9 个十进制数字,以确保经过两次转换后仍可以得到原始的数字。
双精度有效十进制数字的个数介于15和17之间。