在计算机科学与数值分析中,最后一位上的单位值或称最小精度单位,缩写为ULP,是毗邻的浮点数值之间的距离,也即浮点数在保持指数部分的时候最低有效数字为1所对应的值。ULP用于度量数值计算的精度。
例如:圆周率位于毗邻的双精度浮点数3.1415926535897927与3.1415926535897936之间。
设底数为,如果的指数为,那么ULP() = 机器精度·。但在计算机与数值计算的文献中,对,与也可用其它方式定义。如John Harrison给出的定义: ULP()是两个最近的跨()的浮点数与的距离,即 ≤ ≤ 且 ≠ ,并且在指数无上限的情形。这两个定义基本等价。
被所有现代浮点硬件遵从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)。
找到最接近圆周率的双精度浮点数:
#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)*/