tft每日頭條

 > 生活

 > 浮點數的認識

浮點數的認識

生活 更新时间:2024-12-17 02:55:38

浮點數的認識?浮點數的二進制表示,基本上就是用二進制的科學計數法來表示,接下來我們就來聊聊關于浮點數的認識?以下内容大家不妨參考一二希望能幫到您!

浮點數的認識(看完還不懂浮點數)1

浮點數的認識

浮點數的二進制表示,基本上就是用二進制的科學計數法來表示。

一個十進制的數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種特殊情況:

  • 全0代表0.0
  • 全1後接全0代表無窮大,比如2個大數相乘向上溢出
  • 全1後接非全0代表NaN(Not a Numble),比如-1取平方根

為什麼是減127

因此砍掉2個數字之後,實際有效可以表示的範圍變成了[1, 254]。

前面講到為了能支持指數取負數(正數越大能表示的數越大,負數越大能表示的精度越大),需要減去一個值,綜合考慮精度和上限,這個值取中位數比較合适,否則要麼能表示的數不夠大,要麼精度過低。

128或者127都是中位數,可以表示[-127, 126]或者[-126, 127],最終取了127(個人覺得這裡面就沒有那麼大的講究了,隻是取舍)。

移碼

在底層存儲的時候,這個數字并沒有采用整數常用的補碼形式,而是采用了稱為移碼的形式。

移碼跟補碼隻在符号位上有所不同,移碼是1代表正,0代表負。這樣做的好處在于比較浮點數大小時可以當做整數來處理,而不用處理兩次符号位。

,

更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!

查看全部

相关生活资讯推荐

热门生活资讯推荐

网友关注

Copyright 2023-2024 - www.tftnews.com All Rights Reserved