testing - 最低精度的 ULP 单位

标签 testing math precision fractions

谁能解释一下最低精度的 ULP 单位? 我有如下定义,但还是不清楚

“表示分数时的误差大小与存储的数字大小成正比。ULP 或最小精度单位定义了存储数字时可以获得的最大误差。存储的数字越大,ULP 越大”

具体是什么意思? 提前致谢

最佳答案

在浮点格式中,数字用符号 s、有效数(也称为分数)f 和指数 e 表示em>。例如,对于二进制 float ,由 sfe 表示的值是 (-1) sf•2e

f 被限制为一定数量的数字,并且在二进制中,通常要求至少为一位且小于两位。可以对数字进行的最小更改(下面讨论的某些异常(exception)情况)是将 f 的最后一位修改为 1。例如,如果 f 被限制为六位二进制数,那么它的值从 1.00000 到 1.11111,它可以做的最小变化是 0.00001。给定指数 ef 变化 0.00001 会修改 0.00001•2e 表示的值。这是最小精度单位 (ULP)

请注意,ULP 因指数而异。

我提到的异常发生在最大的可表示有限值(其中数字只能通过产生无穷大来增加),最小(最负)的可表示有限值,零和次正规数(特殊情况发生在分数和指数),以及指数变化的边界。在这些边界处,您正在减小指数,这意味着 f 的最低有效数字的值减小,因此步长实际上是旧 ULP 的 ½。

当单个操作仅受浮点系统在其有限范围内(而不是超出该范围)可以表示的数字的限制时,结果中的最大误差为 ULP 的 ½。这是因为,如果您距离精确的数学结果超过 ½ 个 ULP,您可以将计算结果更改 1 个 ULP,以便其误差幅度减小。 (例如,如果精确结果为 3.75,则从 3 更改为 4 会将误差从 .75 更改为 .25。)

基本算术运算,例如加法、乘法和除法,应提供四舍五入到最接近的可表示结果的结果,因此它们的误差最多为 ½ ULP。平方根也应该以这种方式实现。数学库函数(如余弦和对数)的目标是提供良好的舍入,但很难获得正确的舍入,因此商业库通常不保证正确的舍入。

从十进制(例如 ASCII 文本)到内部浮点格式的转换应该正确舍入,但并非所有软件库或语言实现都能正确执行此操作。

复合运算(例如为获得结果执行多次计算的子例程)将存在许多舍入误差,并且通常不会返回与数学上精确结果相差 ½ 个 ULP 以内的结果。

请注意,表示分数时误差的大小与存储的数字的大小成正比,这在技术上是不正确的。误差的界限大致成正比——我们可以说 ½ ULP 是误差的界限,而一个 ULP 大致与数量成正比。它只是大致成正比,因为它的变化系数为两倍(当使用二进制时),因为分数范围从一到二。例如,1 和 1.9375 具有相同的 ULP,因为它们使用相同的指数,但 ULP 中 1 的比例大于 1.9375。

而且只有误差范围大致成正比。实际错误取决于所涉及的数字。例如,如果我们将 1 和 1 相加,我们将得到 2 且没有错误。

关于testing - 最低精度的 ULP 单位,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43965347/

相关文章:

bash - n-1 个核心的一个衬垫?

使用 tsung 测试 websocket 服务器

javascript - 如何获取元素的 outerHTML、innerHTML 和 getText()

javascript - 如何在 Cypress 中设置/定义环境变量和 api_Server?

python - 类型错误 : '>' not supported between instances of 'list' and 'int'

haskell - 如何在代码中调用函数来返回多项式的次数?

performance - 256位定点算法, future ?

linux - AIX 和 Linux 上的 Fortran 输出不正确

c - 如何在 C 中使用按位和逻辑运算符将无符号数乘以四

javascript - React/Jest 错误 : services. map is not a function