在計算機科學與數值分析中,最後一位上的單位值或稱最小精度單位,縮寫為ULP,是毗鄰的浮點數值之間的距離,也即浮點數在保持指數部分的時候最低有效數字為1所對應的值。ULP用於度量數值計算的精度。[1]
例如:圓周率位於毗鄰的雙精度浮點數3.1415926535897927與3.1415926535897936之間。
定義
設底數為b,如果x的指數為E,那麼ULP(x) = 機器精度·bE。[2]但在計算機與數值計算的文獻中,對ULP,指數與機器精度也可用其它方式定義。如John Harrison給出的定義: ULP(x)是兩個最近的跨(straddling)x的浮點數a與b的距離,即a ≤ x ≤ b且a ≠ b,並且在指數無上限的情形。[3][4]這兩個定義基本等價。
被所有現代浮點硬件遵從IEEE 754標準要求基本算術運算(1985年起的加法、減法、乘法、除法、求平方根,以及2008年起的「積和熔加運算(FMA)」)的結果近似到最近的浮點數且與數學確切結果的距離在0.5 ULP範圍內。這性質意味着近似結果與數學確切結果的距離是最小的(但對於居中情形,有兩個毗鄰的浮點數都滿足上述要求)。有美譽的數值庫(numeric library)計算基本超越函數的誤差在0.5至大約1 ULP間。僅有少數庫在計算超越函數時的誤差小於0.5 ULP,這一問題相當複雜,歸因於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)
*/
設x用IEEE 754表示時四捨五入且捨入到偶數的操作記為RN。如果ULP(x)的值小於等於1,那麼RN(x + 1) > x;否則,RN(x + 1) = x或RN(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開始提供了計算給定方向的下一個浮點數的函數:
nextafterf
與nexttowardf
用於float
, nextafter
與nexttoward
用於double
, nextafterl
與nexttowardl
用於long double
, 都在<math.h>
中聲明。[6]
Boost C++ Libraries提供了boost::math::float_next, boost::math::float_prior, boost::math::nextafter與boost::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.