我对ULP的理解是,它是两个连续浮点数之间的差距。我正在读的书说 ULP = 机器 epsilon 乘以 2 的指数。仅当两个数字具有相同指数时,这对我来说才是正确的。
例如,假设您有一个 5 位尾数和一个 3 位指数,并且您有浮点数
11111 100
。为了找到下一个最大的浮点数,你不能简单地在尾数上加上 1/32,因为这样会溢出。那么,你能说像 11111 100
这样的数字有 ULP 吗?
“ULP”代表“最低精度单位”。因此,从名称上看,它是有效数字中最低数字的位置值(浮点表示形式的小数部分的首选术语,而不是尾数)。因此,顾名思义,最大可表示有限数的 ULP 就是所谓的按指数缩放的 epsilon。
正如 njuffa 所指出的,ULP 或类似概念有多种定义,因此您使用哪个定义取决于您想要服务的目的。它对于讨论或推理浮点数之间的间距很有用,但必须考虑到各种特征。
例如,说 ULP 是到下一个可表示值的距离是不正确的。正如您所指出的,原因之一是在最大可表示的有限数处失败。另一个原因是,在指数变化的每个点上,负数都会失败。在以二为基数的格式中,从 -1 到下一个更大的可表示数字的距离是 -1 的 ULP 的一半,而不是完整的 ULP,因为指数减小了。
浮点算术运算中的舍入行为就好像存在比最大可表示有限值大一个 ULP 的另一个可表示值。如果舍入会产生下一个数字,则会产生 ∞。因此,在某种程度上,ULP 是“下一个”数字的步长。
当您想要讨论某个数字处的浮点数之间的间距,但该数字无法以浮点格式表示时,就会出现 ULP 的另一个问题;它位于两个可表示的数字之间。由于它无法在格式中表示,因此它在格式中确实有一个有效数,因此它的有效数中没有最低数字。您需要标称 ULP 以外的测量。
大多数情况下我更喜欢用 ULP 来表示包含数字绝对值的指数区间中的数字间距,[be, be+1),然后讨论/证明我需要的任何误差、精度或舍入属性。但该定义仍然需要在零附近的区间和超出最大可表示有限值的情况下完成。