咱們開發一個電商App商品的價格經常會是 9 塊 9;算法
如今流行的深度學習算法,對應的機器學習裏的模型裏的各個權重也都是 1.23 這樣的數。瀏覽器
能夠說,在實際的應用過程當中,這些有零有整的實數,是和整數一樣經常使用的數據類型,咱們也須要考慮到。機器學習
出來的結果竟然不是準確的 0.9,而是 0.8999999999999999 這麼個結果。這是爲何呢?工具
32個比特,可以表示全部的實數嗎?學習
答案很顯然是不能。編碼
一、32 個比特,只能表示 2 的 32 次方個不一樣的數,差很少是 40 億個。若是表示的數要超過這個數,就會有兩個不一樣的數的二進制表示是同樣的。spa
那計算機可就會束手無策,不知道這個數究竟是多少。命令行
二、40 億個數看似已經不少了,可是比起無限多的實數集合卻只是滄滄海一粟。因此,這個時候,計算機的設計者們,就要面臨一個問題:設計
我到底應該讓這 40 億個數映射到實數集合上的哪些數,在實際應用中才能最划得來呢?blog
若是咱們想在一張便籤紙上,用一行來寫一個十進制數,可以寫下多大範圍的數?
由於咱們要讓人可以看清楚,因此字最小也有一個限制。你會發現一個和上面咱們用 BCD 編碼表示數同樣的問題,
是紙張的寬度限制了咱們可以表示的數的大小。若是寬度只放得下8 個數字,那麼咱們仍是隻能寫下最大到 99999999 這樣的數字
有限的寬度的便籤,只能寫下有限大小的數字
咱們用科學計數法來表示這個數字。宇宙內的原子的數量,大概在 10 的 82 次方左右,咱們就用 這樣的形式來表示這個數值,不須要寫下 82 個 0。
它定義了兩個基本的格式。一個是用 32 比特表示單精度的浮點,也就是咱們經常說的 float 或者 float32 類型、。另一個是用 64 比特表示雙精度的浮點數,也就是咱們平時double 或者 float64 類型。
咱們就要用上在 e 裏面留下的 0 和 255 這兩個表示,
這兩個表示實際上是兩個標記位。在 e 爲 0 且 f 爲 0的時候,咱們就把這個浮點數認爲是 0。
至於其它的 e 是 0 或者 255 的特殊狀況,你能夠看下看下面這個表格,分別能夠表示出無窮大、無窮小、NAN 以及一個特殊的不規範數
咱們能夠以 0.5 爲例子。0.5 的符號爲 s 應該是 0,f 應該是 0,而 e 應該是 -1,也就是對應的浮點數表示,就是 32 個比特。
你會看到,在這樣的表示方式下,浮點數可以表示的數據範圍一會兒打了不少,正是由於這個數對應的小數點的位置是「浮動」的它才被稱爲浮點數,
隨着指數位e的值得不一樣,小數點的位置也在變更,對應的,前面的BCD編碼的實數,就是小數點固定在某一位的方式,咱們也就把它稱爲定點數
回到咱們最開頭,爲何咱們用 0.3 + 0.6 不能獲得0.9 呢?這是由於,浮點數沒有辦法精確表,示 0.三、0.6 和 0.9。事實上,咱們拿出 0.1~0.9 這 9 個數,
其中只有 0.5 可以被精確地表示成二進制的浮點數,也就是 s = 0、e = -一、f = 0這樣的狀況
而 0.三、0.6 乃至咱們但願的 0.9,都只是一個近似的表達。這個也爲咱們帶來了一個挑戰,就是浮點數不管是表示仍是計算其實都是近似計算。那麼,在使用過程當中,
咱們該怎麼來使用浮點數,以及使用浮點數會遇到些什麼問題呢?下一講,我會用更多的實際代碼案例,來帶你看看浮點數計算中的各...「坑」。