看完這篇文章,你肯定理解什麼是浮點數了!

2021-02-20 碼農翻身

浮點數是我們在編程中常用的一個數據類型,不知道大家想過沒有,它為什麼叫做float呢?

還有,計算機對浮點數的內部表示方法IEEE 874到底是怎麼回事?

要徹底理解浮點數,需要從計算機的底層存儲開始。

假設有一個32 bit的計算機,需要你來設計一個支持存儲「小數」的方案,你會怎麼辦呢?

最簡單的辦法就是把這32位存儲分成若干部分, 例如三個部分

(1) 用1位來表達正負位, 0為正, 1為負。

(2) 再劃出8位來表示整數部分

(3) 剩下的23位表示小數部分。

就像這樣:

上圖表示的數值就是182.375,由於小數點固定在了第23位和第24位之間,這種方式可以稱為「定點數」。

很明顯,由於整數部分的長度比較短,所能表示的數據的範圍就比較小。 小數部分比較長, 所能表示的精度就比較高。

我們暫時把這種數據類型叫做fixed number A 。

如果想要表達更大範圍的數怎麼辦? 我們還可以定義一個新的數據類型: fixed number B。 讓整數部分擴大一些。

用23位表示整數,這範圍比8位大多了, 但是精度又會受到損失了,可見用這種定點數的表示法,範圍和精度是一對兒矛盾。

如果再定義fixed number C, fixed number D, 程式設計師簡直就不知道用哪個了, 並且實現他們之間的計算也很麻煩。

所以定點數並不是完美的解決方案。

怎麼解決定點數的「僵化」問題呢?

我們都知道科學記數法,例如368.79 用科學計數法表示就是 3.6879 * 10 ^2 。

其中3.6879就是尾數,10 是基數, 2 是指數。

浮點數就是利用指數達到了小數點「浮動」的效果。從而可以靈活地表達更大範圍內的數, 比如 :

3.6879 * 10 ^ 2 = 368.79

1.2345 * 10 ^ 3 = 1234.5

7.89 * 10 ^ 2 = 789

小數點的位置是不固定的。

不過對於同一個浮點數,也有很多表達方式, 368.79 可以表達為:

3.6879 * 10 ^ 2

0.36879 * 10 ^ 3

36.879 * 10 ^ 1

由於其多樣性, 很多計算機廠商都設計了自己的表示浮點數的規則,以及對浮點數運算的細節。 多樣的規則對於程序的可靠性和移植性都是不利的。

1976年, 一家叫Intel的公司要設計一個叫做8087的晶片, 這個晶片在8086處理器(這可是大名鼎鼎的晶片啊,計算機系的同學估計很熟悉吧)上增加了支持浮點數的功能。 他們請加州大學伯克利分校的William Kahan教授作為顧問,幫助設計8087晶片。

Intel 還支持Kahan教授加入IEEE資助的制定工業標準的委員會, 最終這個委員會採納的標準非常接近於Kahan為Intel設計的標準,這就是大名鼎鼎的 IEEE 754 標準。

(碼農翻身註:這段描述來自於《深入理解計算機系統》)

該標準在1985年發布,成為了各個計算機廠商都支持的規範,大大提高了程序的可移植性。

最新的標準是2008年發布的 IEEE 754-2008 。

William Kahan教授

這個標準中有單精度(32位)和雙精度(64位), 我們以32位為例來介紹一下,理解了32位,64位就不在話下了。

用科學記數法表示,應該是這樣的:

(+ or - ) 1.(mantissa) * 2 ^ exponent

注意:小數點前面是有個1的。

我們接下來用一個例子來計算一下, 把5.8 這個10進位小數轉換為IEEE 754表示的浮點數。

首先,5.8 = 1.45 * 2 ^ 2,可能有人問,這是怎麼算出來的? 很簡單:

5.8/2 => 2.9 

2.9/2 => 1.45 

接下來就可以把他表示成IEEE 754的形式:

(1) 可以看出 符號位 s = 0

(2) 指數(exponent) 是2 嗎?

No!  指數也有正負之分,我們既要能用8位二進位數字表示正數,又要能表示負數。

所以2的8次方這256個數字要區分開來使用: 從0到127 表示負數, 從128到255表示正數。

127 被稱為 Bias  value (偏置值)

所以exponent = 127 + 2 = 129 , 把129用二進位表示就是10000001。

(註:如果原始的指數是 - 2 , 那exponent 就是 127- 2 = 125)

(3) 尾數mantissa 是0.45 , 需要轉化成二進位,怎麼做呢? 也很簡單,不斷地乘2,取結果的整數部分就行,詳細過程如下:

可以看出,出現無限循環了,我們取夠IEEE 754要求的23位就行了(0.01 1100 1100 1100 1100 1100 1.),可見浮點數是不精確的!

最終,我們把5.8變成了符合IEEE 754 規範的浮點數表示: 

很簡單的,對吧?

敏銳的同學可能已經看出問題了,這個尾數總是1.mantissa的形式, 那用這種方式怎麼才能表示零呢?  

這就留作一個小問題讓大家去探索吧, 你會發現非規格化,無窮大,NaN等有趣的東西。

(完)

相關焦點

  • 15 張圖帶你深入理解浮點數
    浮點數為什麼會存在 -0?infinity 和 NaN 又是怎麼表示的?如果現在不會,那這篇文章正好可以為你解惑。1、什麼是浮點數我們知道,數學中並沒有浮點數的概念,雖然小數看起來像浮點數,但從不這麼叫。那為什麼計算機中不叫小數而叫浮點數呢?
  • 看完這篇文章你就知道了!
    看完這篇文章你就知道了! 看完這篇文章你就知道了!2020-11-27 17:00:00樂清應急管理
  • 看完這篇文章,你就會明白記憶是怎樣形成的
    看完這篇文章,你就會明白記憶是怎樣形成的歡迎大家收看本文章,我是本文章的小編小汐,如果你們看完文章之後有什麼想說的想表達的 ,可以留言給小編喲,接下來我們一起欣賞一下正文吧!如果說你學會了什麼,也就意味著你記住了某種東西,因此在心理學看來,學習複習還有記憶回憶都是密不可分,或者說幾乎就是同一回事。我們通常所指的記憶,就是我們能夠回憶起來的東西,比如我們昨天吃了什麼?我們上次看這本書看到什麼位置了,但是還有一些東西是我們其他的重要的記憶方式。
  • 第五人格:勘探員「磁鐵」究竟有什麼用?看完這篇文章你就懂了!
    最近第五人格官方終於公布了新求生者勘探員的技能介紹,這個角色主要的功能就是使用天外隕石製作的磁鐵來攻擊和躲避監管者的,不過說實話官方對於新角色技能的描述每次基本都是一樣的,玩家單獨看每一個字都能看明白,但是這些字連到一起就完全不知道是什麼意思了。
  • 是什麼決定了手錶的檔次?你看完這篇文章立刻明白
    更不用說只在電影電視裡、還有抖音視頻裡出現的百萬名表,以及有著億萬富翁必備的「理察米勒」等等這類頂級高端品牌了。那麼對於普通人來說只能靠品牌判斷的手錶檔次,也可以理解為靠廣告推廣砸出來的「身價」在修表師眼裡是不是也真的將檔次劃分的也這麼清楚呢?看完這篇文章你就知道了。
  • 看完這篇文章,你還會問陳景潤證明「1+2」有什麼意義嗎?
    原標題:看完這篇文章,你還會問陳景潤證明「1+2」有什麼意義嗎? 這的確是好話題. 為什麼這麼說呢, 因為哥德巴赫猜想(簡稱"1+1")可以說是在中國知名度最高的數學難題. 如果有人上大街做個調查, 讓路人甲說出個數學猜想來, 肯定最多人回答哥德巴赫猜想; 如果要說出幾個中國數學家的名字, 那肯定是華羅庚, 陳景潤(陳景潤在這方面做出突出工作, 華羅庚是他師傅).
  • 看完這篇文章!教你迅速敲定畢業論文選題!
    看完這篇文章!教你迅速敲定畢業論文選題!在確定了內容以後,就要對題目中的關鍵字眼進行針對地選擇,比如當論文篇幅不長的時候,儘量避免出現「全國」等涵蓋面較廣的詞彙,防止寫作過程當中無法展開敘述;其此就是對關鍵字眼的理解和把握,比如題目當中出現「修繕」二字時,我們應該明白,正文敘述過程中,要以修理和改善作為寫作的主要方向。
  • 看完這篇文章你就知道了!
    看完這篇文章你就知道了!看完這篇文章你就知道了!》
  • 看完這兩篇文章,我無語了!因為正文真的是……
    看完這兩篇文章,我無語了!因為正文真的是無語呢…… 頂級期刊《Nature Chemistry》網站曾經在2014年6月刊登了一篇投稿,標題是「不含化學物質的產品名單」。作者是兩位著名化學家Chemjobber和Alex Goldberg。
  • 你應該知道的浮點數基礎知識
    由於y會先加後減同樣一個數值,照理說這兩段代碼的作用和效率應該是完全一樣的,當然也是沒有任何邏輯意義的。假設現在我告訴你:其中一段代碼的效率要比另一段慢7倍。想必讀者會認為一定是y+=0.1f的那段慢,畢竟它和y+=0相比看上去要多一些運算。但是,實驗結果,卻出乎意料, y+=0的那段代碼比y+=0.1f足足慢了7倍……世界觀被顛覆了有木有?
  • 一文讀懂浮點數
    其實可以這樣,如果你想要二進位數,就根據 e 去移動 1.f 中的小數點,當 e>0 時,小數點向右移動,當 e<0 時,小數點向左移動,e 是幾就移動幾位,移動完小數點就得到了二進位的浮點數;如果你想要十進位數,就把 1.f 轉成十進位,然後按照十進位的規則去計算,最後把兩者相乘,就得到了十進位的浮點數。
  • ACT高分備考,只看這篇文章就足夠了!
    沒有原版小說閱讀經驗的學生,會覺得這類文章有難度。讀下來的感覺是,詞彙都認識,但是整體在講什麼,很暈。  小說語言有固定的特點,文學性較強,小說文章也有特定的結構,從情節上看,關於個人回憶,成長類居多,有比較細膩的心理描寫,不經過訓練很難短期突破。
  • 看完這篇文章你就明白了!
    看完這篇文章,你就會明白。我們都知道。雞蛋裡的蛋黃和蛋白的營養物質並不相同。一些人並不喜歡吃蛋黃,但是一些人不喜歡吃蛋白。這到底是為什麼呢?原來是因為大黃的口感並不爽口,因為吃蛋黃的時候會感覺有噎著的情況。
  • 看完這篇文章你就知道火星著陸有多難
    我們為什麼要去火星呢,去火星探索並且安全著陸到底有多難,看完這篇文章你就明白了。火星和地球一樣擁很多相同的地形地貌,有高山、平原和峽谷,而且據最新消息,火星上有液態水,這個數據表明了什麼呢:火星和地球一樣,可能有生命存在或者能衍生出生命的基本條件環境--穩定的自轉周期和公轉周期和液態水。當然,火星是否真的有液態水,我們不得而知,等待天問一號考察數據後我們便知分曉。
  • 三維立體圖的原理是什麼?怎麼製作的呢?看完這篇文章你就懂了
    舉報   三維立體圖片是上世紀70—80年代的產物,在那個年代非常的火爆,現在30—50歲的人基本都會看,
  • 看完這篇文章你就清楚了
    肺部小結節與肺癌之間到底有什麼關係? 一次疫情,讓人們更加注重自己的身體健康,隨著做胸部CT的人不斷增多,越來越多的人發現了「肺部小結節」。究竟什麼是肺結節?肺結節嚴重嗎?它是肺癌的前兆嗎?查出肺結節應該如何處理?這是每一位患者都很關心的問題,耐心看完這篇文章,這些問題就清楚了。
  • 去南極之前,你知道要準備一些什麼嗎?看完這篇文章你就知道了
    去南極之前,你知道要準備一些什麼嗎?看完這篇文章你就知道了大家好,我是喜歡遊玩的小菲,今天要跟大家分享的地方就是我們的南極,但是都知道我們的南極,是非常寒冷的,所以現在去南極的人也不是特別多,大家也知道去我們的南極也是比較麻煩的,需要乘坐飛機、輪船等等的一些交通工具,然後除了這些之外,還有我們的一些個人物品要準備,但是又因為天氣極寒,普通的保暖禦寒的衣服也不一定可以完全有用,所以今天小編就來告訴你們,再去南極之前,要準備些什麼
  • 看完這篇文章,你就知道拿到作文高分並不困難!
    閒話少說,今天這篇文章主要介紹的就是兩類議論文的寫作方法。事實上,能達到三等的水準,至少說明審題立意這方面已經過關了。不過中考和高考的立意範圍寬得很,一般除了臨場腦抽的情況外,絕大多數作文的立意都在可以接受的範圍內,至少不會偏離太遠。所以,我們這篇文章要解決的,就是幫助那些在二等和三等之間掙扎的學生,如何通過正確的方法,接近甚至達到一等評分標準。
  • 看完這篇文章,你就明白了!
    日常生活中,說到打嗝這件事,想必大家對它並不陌生,每次我們吃的過飽時很容易會出現打嗝這一現象;打嗝並不會影響到我們的身體健康,我們只是稍微會感覺到有些不舒服罷了。但是倘若你最近頻繁性的打嗝,那麼這個時候就需要提高警惕了,這極有可能是疾病問題所導致的,還請及時去醫院進行就診和檢查。
  • 電解電容極性接錯會爆炸,如何避免,看完這篇文章你就懂了
    電解電容極性接錯就會發生爆炸,如何避免正負極接錯,看完這篇文章你就懂了。避免一:電解電容正負極判斷(1)外觀辨別首先拿出一個電解電容,第一種方法是看電解電容膠管,膠管一端印有負極的標示。另外一端正極則不表示。第二種方法是看電解電容引腳。