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”加上正号或负号即可。