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