float在内存中占4个字节(32bit),32bit=符号位(1bit)+指数位(8bit)+底数位(23bit)
指数部分
指数位占8bit,可以表示数值的范围是0-255(表示0~255一共256个数),因为指数可正可负,所以IEEE规定,此处算出的次方必须减去127才是真正的指数,
所以float的指数范围是 -127(0-127) 到+128(255-127)。
底数部分
任何一个数的科学记数法都可以表示为1.xxx*2^n,小数部分就可以表示为xxx,整数部分永远是1,不影响精度,所以可以不用储存。23bit二进制可以表示的
最大值是2^23=8388608,一共7位,这意味着最多能有7位有效数字(不能表示比8388608大的数值),但绝对能保证的为6位,即float的精度为6~7位有效数字。
以8.25为例:
8.25=1000.01
1000.01的科学记数法是1.00001*2^3
符号位,正数为0,负数为1
指数=3,即x-127=3,因此x=130,所以指数位应该是130,对应的二进制数是10,000,010
底数=00001,不足补0,所以23bit对应的二进制数是00,001,000,000,000,000,000,000
所以最终在内存中二进制数是 0 10,000,010 00,001,000,000,000,000,000,000
4个字节的值是 65 4 0 0
double存储方式和float相同,区别在于64bit=符号位(1bit)+指数位(11bit)+底数位(52bit)
指数部分算出的次方必须减去1023才是真正的指数,
double的小数部分可以表示的最大值是2^52=4,503,599,627,370,496,这意味着最多能有16位有效数字,但绝对能保证的为15位,即double的精度为15~16位有效数字。