ulp(unit in the last place)是什麼意思

ULP

百度上的資料非常少,我總結了我查到的相關資料,希望幫助到大家理解。若有解釋不當的地方,歡迎指正!

ULP(Unit in the last place)是計算機科學中的一個誤差單位。

想要理解什麼是ULP就需要了解浮點數的原理,本篇文章不做解釋,網上的資料很多,這裏貼個鏈接:

浮點數的表示方法CSDN

下面開始介紹ULP


單個實數值的ULP定義與計算

定義:對於給定的浮點格式,特定實數值的 ulp 是與此實數值左右最近的兩個浮點數的距離。

以IEEE754標準的32位浮點數爲例。如果想表示實數值 0.1 是無法準確表示的,只能用最接近 0.1 的可以精確表示的浮點數來表示。這樣的數有兩個,設爲A、B,它們的十六進制和十進制表示分別爲:

A:
十六進制:0x3dcccccc
十進制:0.099999994039536

B:
十六進制:0x3dcccccd
十進制:0.10000000149012

那麼 0.1 的 ulp 就等於 |A - B| = 0.00000000745076

如果計算機 1 使用向下近似的方法用 A 來表示 0.1
那麼誤差 = 0.1 - 0.099999994039536 = 0.000000005960464 = (0.000000005960464 / 0.00000000745076) * ulp ≈ 0.8 ulps

如果計算機 2 使用向上近似的方法用 B 來表示 0.1
那麼誤差 = 0.10000000149012 - 0.1 = 0.00000000149012 = (0.00000000149012 / 0.00000000745076) * ulp ≈ 0.2 ulps

由上述計算可知,在 IEEE754 標準的 32 位浮點數的前提下,計算機 1 關於 0.1 的計算誤差爲 0.8 ulps,計算機 2 關於 0.1 的計算誤差爲 0.2 ulps。

函數中的ulp定義以及計算

注:

  1. 這裏說的函數指的是程序中的函數,至於其定義能否擴展到數學中的函數我不太清楚。
  2. 下文所討論的函數都是返回值爲浮點數的函數,因爲整數計算不存在ulp誤差。

定義:當討論一個函數的整體準確性而不是某個特定實數值時,所引用的 ulps 的數量是任何參數下最壞情況的誤差。 如果某個函數的錯誤始終小於0.5 ulps,則該函數始終返回最接近精確結果的浮點數,這樣的函數是正確舍入的。

逐句解釋一下:

第一:“當討論一個函數的整體準確性而不是某個特定實數值時”

這句很好理解,之前討論的是單個實數值的 ulp,也就是計算單個數值的誤差。但是當我們評判一個函數(方法)的準確性時,就不能用單個數值的 ulp 來代表整個函數的準確性,所以需要對一個函數的 整體準確性 進行定義。

第二:“所引用的 ulps 的數量是任何參數下最壞情況的誤差”

首先,如何理解 “ulps 的數量” 。ulps 就是 ulp 的複數形式。上文中提到的計算機 1、2 在計算 0.1 的時候產生的誤差分別是 0.8 ulps 和 0.2 ulps。可以看成是 0.8個ulp 和 0.2個ulp。這裏的 0.8 和 0.2 就是 ulps 的數量。

理解了ulps 的數量之後,再理解整句話就簡單多了。函數都有輸入和輸出嘛,不同的輸入一般對應不同的輸出,所以也就對應着不同的誤差大小。假設某一個函數在任何輸入下產生的輸出誤差都不會大於 0.5 ulps ,那麼這個函數在 “任何參數下最壞情況的誤差” 就是 0.5 ulps!這個函數的 “所引用的 ulps 的數量 就是 0.5 ulps!

第三:“如果某個函數的錯誤始終小於0.5 ulps,則該函數始終返回最接近精確結果的浮點數,這樣的函數是正確舍入的。”

理解了上面的內容後,這句話也比較好理解了。對於一個函數,不同的輸入會產生不同的誤差,如果函數在任何情況下產生的誤差總是小於 0.5 ulps。那麼說明這個函數總是能夠返回最接近精確結果的近似值。這樣的函數是正確舍入的。

那什麼是錯誤舍入的函數呢,就是當這個函數有時候的誤差小於 0.5 ulps 有時候的誤差大於 0.5 ulps。那麼這個函數是個不合格的函數,也就是錯誤舍入的函數。

爲什麼以 0.5 ulps 爲判斷函數的標準呢。這個也很好解釋。
函數的精確解設爲:
res res
精確解左邊的最近的浮點數設爲:
res res_左
精確解右邊的最近的浮點數設爲:
res res_右
那麼一個好的函數,當然要儘可能使誤差最小化:

errormin=minresres,resres error_{min} = min(|res - res_左|, |res - res_右|)

由下圖
在這裏插入圖片描述
可知,在任何情況下,最小誤差都不會小於 0.5 ulps,也就是:
MAXerrormin=0.5ulps MAX(error_{min}) = 0.5 ulps

所以以0.5 ulps 作爲評判標準。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章