谁能解释一下最不精确的 ULP 单位? 我有以下定义,但仍然不清楚
“表示分数时的误差大小与存储的数字的大小成正比。ULP或最小精度单位定义了存储数字时可以获得的最大误差。存储的数字越大,ULP越大。”
这到底是什么意思? 预先感谢
在浮点格式中,数字用符号 s、尾数(也称为分数)f 和指数 e 表示。例如,对于二进制浮点数,s、f和e表示的值为 (-1)s•f•2e
f 仅限于一定数量的数字,并且对于使用 2 作为基数的浮点格式,通常要求至少为 1 且小于 2。可以对数字进行的最小更改(除了下面讨论的某些例外)是将 f 的最后一位数字修改为 1。例如,如果 f 限制为 6 位二进制数字,则它的值从 1.00000 开始到 1.11111,并且可以进行的最小更改为 0.00001。给定指数 e,f 中 0.00001 的变化会修改 0.00001•2e 表示的值。这是最小精度单位 (ULP)
请注意,ULP 根据指数而变化。
我提到的例外发生在最大的可表示有限值(其中数字只能通过产生无穷大来增加)、最小(最负)可表示有限值、零和次正规数(其中分数发生特殊情况)和指数),以及指数变化的边界。在这些边界处,您正在减小指数,这意味着 f 的最低有效数字的值减小,因此步长实际上是旧 ULP 的 1/2。
当单个运算仅受浮点系统在其有限范围内可以表示的数字(而不是超出该范围)限制时,结果中的最大误差为 ULP 的 1/2。这是因为,如果您与数学上精确的结果相差超过 ULP 的 1/2,您可以将计算结果更改 1 ULP,从而使其误差减小。 (例如,如果精确结果为 3.75,则从 3 更改为 4 会将误差从 0.75 更改为 0.25。)
基本算术运算(例如加法、乘法和除法)应提供四舍五入到最接近的可表示结果的结果,因此它们的误差最多为 ULP 的 1/2。平方根也应该以这种方式实现。数学库函数(例如余弦和对数)提供良好的舍入是一个目标,但很难获得正确的舍入,因此商业库通常不保证正确的舍入。
从十进制(例如 ASCII 文本)到内部浮点格式的转换应该正确舍入,但并非所有软件库或语言实现都能正确执行此操作。
复合运算,例如执行许多计算以获得结果的子例程,将有许多舍入误差,并且通常不会返回与数学精确结果的 ULP 1/2 以内的结果。
请注意,表示分数时的误差大小与存储的数字大小成正比,这在技术上是不正确的。误差的 bound 大致成正比——我们可以说 ½ ULP 是误差的界限,而 ULP 大致与数量成正比。它只是大致成比例,因为当分数范围从一到二时,它会变化两倍(使用二进制时)。例如,1 和 1.9375 具有相同的 ULP,因为它们使用相同的指数,但 ULP 中 1 的比例大于 1.9375 的比例。
只有误差的界限大致成正比。实际错误取决于所涉及的数字。例如,如果我们将 1 和 1 加起来,我们会得到 2,没有错误。
每个浮点数代表一个实数区间。该间隔相对于其浮点数(解释为二进分数)的位置取决于舍入模式。误差与区间内任意实数到浮点数的最大距离有关。
所以最安全的答案是到两边下一个浮点数的距离。如果舍入模式是通常的舍入到最接近的浮点数,则最大误差是其一半。