5分钟聊聊浮点数的底层存储

浮点数的二进制表示,基本上就是用二进制的科学计数法来表示。
一个十进制的数0.75,用科学计数法表示是+7.5*10^-1,分为3个部分,正负号、7.5和-1。
其中小数点前的部分,一定是一个1-9之间的数。也就是你不能写成+75*10^-2。
好了,换成2进制(以下均以float类型为例),由于它占用的位数有限(一般是32位),因此我们需要仿照十进制科学计数法的方式,把这些位切分为3部分。
符号只有正负,因此用1位表示。
指数和尾数部分的划分决定了数字能表示的最大值和精度。IEEE的标准,指数位是8位,剩下是尾数位。
8位可以表示的范围是0到255,或者-127到+128,为了能表示2^-1的概念,选择后者。
尾数的精髓在于跟十进制的表示一样,刚才说十进制的小数点之前是1-9,那么二进制的小数点之前一定有一个1。
二进制转十进制
以下面这一串比特位为例:
0-01111110-10000000000000000000000
0是符号位,代表正数。
中间是指数位,写成十进制是126,减去127之后得到-1。
【5分钟聊聊浮点数的底层存储】最后是尾数,忽略末尾的0,同时在小数点前补1,得到1.1,转成十进制是1.5。
我们把三个部分拼起来,得到+1.5*2^-1=0.75
十进制转二进制
以2.75为例子,先把小数点前后都写成二进制形式,得到10.11。
10.11*2^0不满足要求,为了让小数点前的数是1,所以我们向左挪一下小数点,得到1.011*2^1。
(上面这步和把75*10^0写成7.5*10^1是一个意思)
最后我们把3个部分提取出来,分别是符号位0,指数位1+127=10000000,尾数位0110…

    推荐阅读