計算機科學數值分析中,最後一位上的單位值或稱最小精度單位,縮寫為ULP,是毗鄰的浮點數值之間的距離,也即浮點數在保持指數部分的時候最低有效數字為1所對應的值。ULP用於度量數值計算的精度。[1]

例如:圓周率位於毗鄰的雙精度浮點數3.1415926535897927與3.1415926535897936之間。

定義

底數b,如果x的指數為E,那麼ULP(x) = 機器精度·bE[2]但在計算機與數值計算的文獻中,對ULP指數機器精度也可用其它方式定義。如John Harrison給出的定義: ULP(x)是兩個最近的跨(straddlingx的浮點數ab的距離,即axbab,並且在指數無上限的情形。[3][4]這兩個定義基本等價。

被所有現代浮點硬件遵從IEEE 754標準要求基本算術運算(1985年起的加法、減法、乘法、除法、求平方根,以及2008年起的「積和熔加運算(FMA)」)的結果近似到最近的浮點數且與數學確切結果的距離在0.5 ULP範圍內。這性質意味着近似結果與數學確切結果的距離是最小的(但對於居中情形,有兩個毗鄰的浮點數都滿足上述要求)。有美譽的數值庫(numeric library)計算基本超越函數的誤差在0.5至大約1 ULP間。僅有少數庫在計算超越函數時的誤差小於0.5 ULP,這一問題相當複雜,歸因於Table-Maker's Dilemma英語Table-maker's dilemma[5]

例子

找到最接近圓周率的雙精度浮點數:

#include <cmath> 
#include <cstdio> 
#define PI 3.14159265358979323846264338327950288419716939937510582097494459230 

int main() 
{
    printf("%.17g (%a)\n", PI, PI); 
    printf("%.17g (%a)\n", std::nextafter(PI, 0.0), std::nextafter(PI, 0.0)); 
    printf("%.17g (%a)\n", std::nextafter(PI, 4.0), std::nextafter(PI, 4.0)); 
}
/* Output:
3.1415926535897931 (0x1.921fb54442d18p+1)
3.1415926535897927 (0x1.921fb54442d17p+1)
3.1415926535897936 (0x1.921fb54442d19p+1)
*/

xIEEE 754表示時四捨五入且捨入到偶數的操作記為RN。如果ULP(x)的值小於等於1,那麼RN(x + 1) > x;否則,RN(x + 1) = xRN(x + 1) = x + ULP(x),取決於最低有效位(least significant digit)與x的指數部分。下面的Python程序展示了這個例子:

>>> x = 1.0
>>> p = 0
>>> while x != x + 1:
...   x = x * 2
...   p = p + 1
... 
>>> x
9007199254740992.0
>>> p
53
>>> x + 2 + 1
9007199254740996.0

這個例子中,從x = 1開始,反覆地翻倍直至x = x + 1。結果是253,因為雙精度浮點數格式使用了53位有效數字,從而ulp(253)=253*2-52=2 > 1 。即,在這裏雙精度浮點數可表示的最小精度間隔已經是2了。

語言支持

從Java 1.5, Java語言的標準庫包含了函數: Math.ulp(double)Math.ulp(float)

C語言標準庫從C99開始提供了計算給定方向的下一個浮點數的函數: nextafterfnexttowardf用於float, nextafternexttoward用於double, nextafterlnexttowardl用於long double, 都在<math.h>中聲明。[6]

Boost C++ Libraries提供了boost::math::float_next, boost::math::float_prior, boost::math::nextafterboost::math::float_advance等函數獲取鄰近的浮點數。 [7]boost::math::float_distance(a, b)計算兩個double值之間的浮點距離。 [8]

參見

參考文獻

Wikiwand in your browser!

Seamless Wikipedia browsing. On steroids.

Every time you click a link to Wikipedia, Wiktionary or Wikiquote in your browser's search results, it will show the modern Wikiwand interface.

Wikiwand extension is a five stars, simple, with minimum permission required to keep your browsing private, safe and transparent.