浮點數的認識?浮點數的二進制表示,基本上就是用二進制的科學計數法來表示,接下來我們就來聊聊關于浮點數的認識?以下内容大家不妨參考一二希望能幫到您!
浮點數的二進制表示,基本上就是用二進制的科學計數法來表示。
一個十進制的數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的概念,選擇後者。
尾數的精髓在于跟十進制的表示一樣,剛才說十進制的小數點之前是(0, 9),那麼二進制就是(0, 2),也就是小數點之前的數一定是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…
關于指數部分的補充零和無窮大
剛才講指數位有8位,可以表示的範圍有256個數。這裡我們再考慮一些特殊情況,比如我們如何用十進制的科學記數法表示0.0。因此當指數位全為0或者全為1時代表了3種特殊情況:
為什麼是減127
因此砍掉2個數字之後,實際有效可以表示的範圍變成了[1, 254]。
前面講到為了能支持指數取負數(正數越大能表示的數越大,負數越大能表示的精度越大),需要減去一個值,綜合考慮精度和上限,這個值取中位數比較合适,否則要麼能表示的數不夠大,要麼精度過低。
128或者127都是中位數,可以表示[-127, 126]或者[-126, 127],最終取了127(個人覺得這裡面就沒有那麼大的講究了,隻是取舍)。
移碼
在底層存儲的時候,這個數字并沒有采用整數常用的補碼形式,而是采用了稱為移碼的形式。
移碼跟補碼隻在符号位上有所不同,移碼是1代表正,0代表負。這樣做的好處在于比較浮點數大小時可以當做整數來處理,而不用處理兩次符号位。
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!