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…
推荐阅读
- C语言浮点函数中的modf和fmod详解
- 第九期Day8—浮生暂寄梦中梦,梦中说梦两重虚!
- 想聊聊SA,聊聊手帐,也想和你们分享自己
- 爱情她死了
- 3.css浮动
- 水趁浮萍风趁水——纪念外婆
- 浮沉一梦
- 世外小学惨案后,和孩子聊聊世界的“复杂”
- 沉与浮
- 急