浮点数的组成结构
符号位S_指数位E_尾数位M
例如,一个float类型的数据占用4个字节共32位,其各个组成部分为:
符号位(S):最高位(31位)为符号位,表示整个浮点数的正负,0为正,1为负
指数位(E):23-30位共8位为指数位,这里指数的底数规定为2。并且指数位是以补码的形式来划分的(最高位为指数位的符号位,0为正,1为负)。另外,标准中还规定了,当指数位8位全0或全1的时候,浮点数为非正规形式,所以指数位真正范围为:-126~127。
尾数位(M):0-22位共23位为尾数位,表示小数部分的尾数,即形式为1.M或0.M,至于什么时候是 1 什么时候是 0,则由指数和尾数共同决定。小数部分最高有效位是1的数被称为正规(规格化)形式。小数部分最高有效位是0的数被称为非正规(非规格化)形式,其他情况是特殊值。
取值范围
float的【取值范围】是由【指数的位数】来决定的,其中,负指数决定了浮点数所能表达的【绝对值最小】的非0数,而正指数决定了浮点数所能表达的【绝对值最大】的数,也即决定了浮点数的取值范围。
S:符号位,E:指数位,M:尾数位float:S1_E8_M23,指数位有8位,指数的取值范围为-27~27-1(即-128127)float的取值范围为-2^128 +2127(1038级别的数),也即-3.40E+38 ~ +3.40E+38.。
精度
float的【精度】是由【尾数的位数】来决定的,float的尾数位有23位。
float:S1_E8_M23,尾数位有23位,2^23=8388608,一共7位,这意味着最多能有7位有效数字,但能保证的为6位,也即float的精度为6~7位有效数字。
总结
浮点数float在内存中是按科学计数法来存储的,取值范围是由指数的位数来决定的,精度是由尾数的位数来决定的。
位数: 32bit
指数位E:1bit(0正1负) 8bit
扩展范围(指数的取值范围) : -27~27-1(-128~127)
最大/小值(取值范围): 2127(1038级别的数)
尾数位M:23bit
尾数取值范围(精度):8388608,7位,精度为6~7位