浮點數的二進制表示,基本上就是用二進制的科學計數法來表示。
一個十進制的數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。
最後是尾數,忽略末尾的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…