天天看點

非規則浮點數和規則浮點數

本文由量化、資料類型、上溢和下溢衍生,将浮點數看作是實數域的一種量化方式,分析浮點數,尤其是非規則浮點數和規則浮點數之間的差異。

0. 背景、動機和目的

    為了更好了解本文内容,可先行閱讀《量化、資料類型、上溢和下溢》中内容。這裡依舊将浮點數看作是一種量化方式,将連續的不可數的集合映射到有限的集合上去。本文結合單精度浮點數讨論,雙精度浮點與之類似。

    已有多位部落客撰寫過關于非規則浮點數(Denormalized Number)和規則浮點數之間的差別,這裡首推盧鈞轶的你應該知道的浮點數基礎知識。這篇文章從Denormal number和normal number之間的計算效率差別出發,概述了浮點數的相關知識,進而給出了Denormalized Number的定義,文中附有相應代碼。浮點數的大部分知識可以從維基百科擷取,包括

  • Denormal number    非規則浮點數(不知道翻譯是否合适)
  • Floating point    浮點數相關内容
  • IEEE floating point   IEEE754定義的浮點數

    詞條内容中的連結可以擷取更多相關知識。

    我在寫量化、資料類型、上溢和下溢時有兩個目的,一是從數字信号進行中量化的角度出發,闡明計算機内部資料的表示方式(即如何用有限的集合表示任意數,以及會帶來什麼樣的問題),據此給出包括資料類型轉化和計算過程中誤差的産生原因;其二在于提醒自己無論是int或是double資料類型的數,表示能力都是有限的,在使用過程中需要注意上溢和下溢(尤其是下溢)的出現,以免出現錯誤。

    在寫的過程中,當我将浮點數當作非均勻量化時,卻發現這個過程并不那麼順利,或許我應該單獨的說明關于浮點數的相關内容,是以本文作為量化、資料類型、上溢和下溢的補充,旨在闡明

  • 浮點數到底是如何對實數域進行非均勻量化的
  • 為何要這樣進行非均勻量化

1. 浮點數的非均勻量化

    先給出一個示意圖,這裡将(0,4)區間非為了若幹段,每段之間的數配置設定一個一樣的值,這就是量化。而每段的長度是不同的,這種量化方式是非均勻的。

(By Blacklemon67 - created with tikz, CC BY-SA 3.0, https://en.wikipedia.org/w/index.php?curid=46487370)

    為什麼要進行非均勻量化?從數字信号處理的角度來說是為了保持相對一緻的信噪比,當然可以簡單的舉個例子

測量1噸左右的物體,一般而言1噸零1克和零2克基本沒有什麼差別;然而測量重量約為1克的物體,是1克還是2克差别就很大了。

    浮點數的具體定義在量化、資料類型、上溢和下溢中已經給出。

浮點型(32比特浮點)

    參考維基百科, 32比特浮點數的存儲方式表示如下圖。

    對應浮點數取值可表示為(十進制)

    其中對于規則浮點數而言,指數項範圍為01-FE(1到254)。大于0的浮點數依次為

非規則浮點數和規則浮點數

,然而大于1的浮點數依次為

非規則浮點數和規則浮點數

,即量化間隔是不同的。指數項取FF時,可表示正負無窮或是非數(譬如0/0)。我們更關注的是,指數項取0時浮點數的特性。

2. 為何要引入非規則浮點數

    先看看規則浮點數的特點,指數項定義了區間大小,下一段區間長度是目前段的2倍,而fraction将區間等間隔的劃分為了

非規則浮點數和規則浮點數

段,如下圖所示

非規則浮點數和規則浮點數

    顯然,如果僅僅用規則浮點數的表示方式,0到最小正常數之間的間隔要遠遠大于最小正常數到次小正常數之間的間隔,這是不滿足我們的期望的。是以選擇規則浮點數指數項範圍從1開始。剩下的一小段區間(即黃色括号)再均勻劃分為

非規則浮點數和規則浮點數

段,此時指數項取0,表示方式為

非規則浮點數和規則浮點數

    通過這一手段,滿足了當資料(絕對值)越小時,其量化間隔越小(或相等)的要求。這樣可以一定程度上提高計算精度。譬如,若不引入非規則浮點數,任何小于

非規則浮點數和規則浮點數

的數将會下溢為0,而引入不規則浮點數後,小于

非規則浮點數和規則浮點數

的數才會下溢為0 。

3. 非規則浮點數的問題

    非規則浮點數的表示能力依舊是有限的,同時由于其與規則浮點數不相同的定義方式,會導緻計算速率方面的問題,即

  •     非規則浮點數的計算速度慢于規則浮點數(一般而言)
  •     非規則浮點數無法解決計算過程中下溢的産生

    計算速率的問題在盧鈞轶的你應該知道的浮點數基礎知識中已有詳細的讨論,這裡不再重複,僅簡單的說明原因,以加法為例,浮點數加/減的步驟為

  1. 對階。指數項對齊,小的向大的對齊
  2. 尾數求和。對齊後,對尾數進行加/減法
  3. 規則化。對尾數進行截取,保證計算精度
  4. 舍入。判斷丢失的數值,進行舍入
  5. 判斷結果。判斷結果是否溢出

    非規則浮點計算加法時“對階”計算有不同 。normal number和Denormal number的統一表示方式為

非規則浮點數和規則浮點數

    若A,B為Denormal number,對位過程中

非規則浮點數和規則浮點數

    也就是說對階過程可能有三種結果,即

非規則浮點數和規則浮點數

,這增加了計算的複雜程度。但具體的計算過程我也不清楚,就寫到這裡了。

    對于第二個問題,盡管非規則浮點數極大的提高了在0附近的精度,然而浮點數的精度依舊是有限的,無法阻止下溢的發生。是以在計算過程中,尤其是對精度要求較高以及算法是疊代的情況下,一定要注意下溢這一問題。對于溢出的讨論,可參見量化、資料類型、上溢和下溢。

自由轉載,轉載注明出處(http://www.cnblogs.com/sea-wind/)

姓名标示(BY)-相同方式分享(SA)