float, double 的表示范围和精度

float:1bit(符号位)+8bits(指数位)+23bits(尾数位)
double:1bit(符号位)+ 11bits(指数位)+ 52bits(尾数位)

[尾数是指把一个二进制改写成标准的科学计数法 (必须以1.XX的形式,例如1.001*2^1101) 后,小数点后面的小数部分(001)。]

[指数位的第一位也是符号位]

(浮点)数值 =(符号) (1.尾数)×(2)^(带符号的指数)

指数位决定了表示范围:float指数范围 -2^7~2^7-1, 即 -128~127,所以float的范围是 2^-128~2~^127.  double同理

尾数位决定了表示精度:float尾数范围 2^23, 即8 388 608, 所以float的精度是二进制的小数点后23位精度,十进制的小数点后6~7位.  double同理。

 

附加:

将一个float型转化为内存存储格式的步骤为:

     (1)先将这个实数的绝对值化为二进制格式。 
     (2)将这个二进制格式实数的小数点左移或右移n位,直到小数点移动到第一个有效数字的右边。 
     (3)从小数点右边第一位开始数出二十三位数字放入第22到第0位。 
     (4)如果实数是正的,则在第31位放入“0”,否则放入“1”。 
     (5)如果n是左移得到的,说明指数是正的,第30位放入“1”。如果n是右移得到的或n=0,则第30位放入“0”。 
     (6)如果n是左移得到的,则将n减去1后化为二进制,并在左边加“0”补足七位,放入第29到第23位。如果n是右移得到的或n=0,则将n化为二进制后在左边加“0”补足七位,再各位求反,再放入第29到第23位。

举例:01101.1100011101 ----->1.1011100011101*(2^11)  则1011100011101存进尾数部分,11存进指数部分。

将一个内存存储的float二进制格式转化为十进制的步骤: 
 
 (1)将第22位到第0位的二进制数写出来,在最左边补一位“1”,得到二十四位有效数字。将小数点点在最左边那个“1”的右边。 
  (2)取出第29到第23位所表示的值n。当30位是“0”时将n各位求反。当30位是“1”时将n增1。 
  (3)将小数点左移n位(当30位是“0”时)或右移n位(当30位是“1”时),得到一个二进制表示的实数。 
  (4)将这个二进制实数化为十进制,并根据第31位是“0”还是“1”加上正号或负号即可。

你可能感兴趣的:(面试)