本文由量化、數據類型、上溢和下溢衍生,將浮點數看做是實數域的一種量化方式,分析浮點數,尤爲是非規則浮點數和規則浮點數之間的差別。php
爲了更好理解本文內容,可先行閱讀《量化、數據類型、上溢和下溢》中內容。這裏依舊將浮點數看做是一種量化方式,將連續的不可數的集合映射到有限的集合上去。本文結合單精度浮點數討論,雙精度浮點與之相似。html
已有多位博主撰寫過關於非規則浮點數(Denormalized Number)和規則浮點數之間的區別,這裏首推盧鈞軼的你應該知道的浮點數基礎知識。這篇文章從Denormal number和normal number之間的計算效率區別出發,概述了浮點數的相關知識,進而給出了Denormalized Number的定義,文中附有相應代碼。浮點數的大部分知識能夠從維基百科獲取,包括linux
詞條內容中的連接能夠獲取更多相關知識。git
我在寫量化、數據類型、上溢和下溢時有兩個目的,一是從數字信號處理中量化的角度出發,闡明計算機內部數據的表示方式(即如何用有限的集合表示任意數,以及會帶來什麼樣的問題),據此給出包括數據類型轉化和計算過程當中偏差的產生緣由;其二在於提醒本身不管是int或是double數據類型的數,表示能力都是有限的,在使用過程當中須要注意上溢和下溢(尤爲是下溢)的出現,以避免出現錯誤。github
在寫的過程當中,當我將浮點數看成非均勻量化時,卻發現這個過程並不那麼順利,或許我應該單獨的說明關於浮點數的相關內容,所以本文做爲量化、數據類型、上溢和下溢的補充,旨在闡明算法
先給出一個示意圖,這裏將(0,4)區間非爲了若干段,每段之間的數分配一個同樣的值,這就是量化。而每段的長度是不一樣的,這種量化方式是非均勻的。svg
(By Blacklemon67 - created with tikz, CC BY-SA 3.0, https://en.wikipedia.org/w/index.php?curid=46487370)this
爲何要進行非均勻量化?從數字信號處理的角度來講是爲了保持相對一致的信噪比,固然能夠簡單的舉個例子spa
測量1噸左右的物體,通常而言1噸零1克和零2克基本沒有什麼區別;然而測量重量約爲1克的物體,是1克仍是2克差異就很大了。翻譯
浮點數的具體定義在量化、數據類型、上溢和下溢中已經給出。
參考維基百科, 32比特浮點數的存儲方式表示以下圖。
對應浮點數取值可表示爲(十進制)
其中對於規則浮點數而言,指數項範圍爲01-FE(1到254)。大於0的浮點數依次爲,然而大於1的浮點數依次爲,即量化間隔是不一樣的。指數項取FF時,可表示正負無窮或是非數(譬如0/0)。咱們更關注的是,指數項取0時浮點數的特性。
先看看規則浮點數的特色,指數項定義了區間大小,下一段區間長度是當前段的2倍,而fraction將區間等間隔的劃分爲了段,以下圖所示
顯然,若是僅僅用規則浮點數的表示方式,0到最小正常數之間的間隔要遠遠大於最小正常數到次小正常數之間的間隔,這是不知足咱們的指望的。所以選擇規則浮點數指數項範圍從1開始。剩下的一小段區間(即黃色括號)再均勻劃分爲段,此時指數項取0,表示方式爲
經過這一手段,知足了當數據(絕對值)越小時,其量化間隔越小(或相等)的要求。這樣能夠必定程度上提升計算精度。譬如,若不引入非規則浮點數,任何小於的數將會下溢爲0,而引入不規則浮點數後,小於的數纔會下溢爲0 。
非規則浮點數的表示能力依舊是有限的,同時因爲其與規則浮點數不相同的定義方式,會致使計算速率方面的問題,即
計算速率的問題在盧鈞軼的你應該知道的浮點數基礎知識中已有詳細的討論,這裏再也不重複,僅簡單的說明緣由,以加法爲例,浮點數加/減的步驟爲
非規則浮點計算加法時「對階」計算有不一樣 。normal number和Denormal number的統一表示方式爲
若A,B爲Denormal number,對位過程當中
也就是說對階過程可能有三種結果,即,這增長了計算的複雜程度。但具體的計算過程我也不清楚,就寫到這裏了。
對於第二個問題,儘管非規則浮點數極大的提升了在0附近的精度,然而浮點數的精度依舊是有限的,沒法阻止下溢的發生。所以在計算過程當中,尤爲是對精度要求較高以及算法是迭代的狀況下,必定要注意下溢這一問題。對於溢出的討論,可參見量化、數據類型、上溢和下溢。