ulp(unit in the last place)是什么意思

您所在的位置:网站首页 upl是什么格式 ulp(unit in the last place)是什么意思

ulp(unit in the last place)是什么意思

2024-03-16 08:32| 来源: 网络整理| 查看: 265

ULP

百度上的资料非常少,我总结了我查到的相关资料,希望帮助到大家理解。若有解释不当的地方,欢迎指正!

ULP(Unit in the last place)是计算机科学中的一个误差单位。

想要理解什么是ULP就需要了解浮点数的原理,本篇文章不做解释,网上的资料很多,这里贴个链接:

浮点数的表示方法CSDN

下面开始介绍ULP

单个实数值的ULP定义与计算

定义:对于给定的浮点格式,特定实数值的 ulp 是与此实数值左右最近的两个浮点数的距离。

以IEEE754标准的32位浮点数为例。如果想表示实数值 0.1 是无法准确表示的,只能用最接近 0.1 的可以精确表示的浮点数来表示。这样的数有两个,设为A、B,它们的十六进制和十进制表示分别为:

1234567A: 十六进制:0x3dcccccc 十进制:0.099999994039536 B: 十六进制:0x3dcccccd 十进制:0.10000000149012

那么 0.1 的 ulp 就等于 |A - B| = 0.00000000745076

如果计算机 1 使用向下近似的方法用 A 来表示 0.1 那么误差 = 0.1 - 0.099999994039536 = 0.000000005960464 = (0.000000005960464 / 0.00000000745076) * ulp ≈ 0.8 ulps

如果计算机 2 使用向上近似的方法用 B 来表示 0.1 那么误差 = 0.10000000149012 - 0.1 = 0.00000000149012 = (0.00000000149012 / 0.00000000745076) * ulp ≈ 0.2 ulps

由上述计算可知,在 IEEE754 标准的 32 位浮点数的前提下,计算机 1 关于 0.1 的计算误差为 0.8 ulps,计算机 2 关于 0.1 的计算误差为 0.2 ulps。

函数中的ulp定义以及计算

注:

这里说的函数指的是程序中的函数,至于其定义能否扩展到数学中的函数我不太清楚。 下文所讨论的函数都是返回值为浮点数的函数,因为整数计算不存在ulp误差。

定义:当讨论一个函数的整体准确性而不是某个特定实数值时,所引用的 ulps 的数量是任何参数下最坏情况的误差。 如果某个函数的错误始终小于0.5 ulps,则该函数始终返回最接近精确结果的浮点数,这样的函数是正确舍入的。

逐句解释一下:

第一:“当讨论一个函数的整体准确性而不是某个特定实数值时”

这句很好理解,之前讨论的是单个实数值的 ulp,也就是计算单个数值的误差。但是当我们评判一个函数(方法)的准确性时,就不能用单个数值的 ulp 来代表整个函数的准确性,所以需要对一个函数的 整体准确性 进行定义。

第二:“所引用的 ulps 的数量是任何参数下最坏情况的误差”

首先,如何理解 “ulps 的数量” 。ulps 就是 ulp 的复数形式。上文中提到的计算机 1、2 在计算 0.1 的时候产生的误差分别是 0.8 ulps 和 0.2 ulps。可以看成是 0.8个ulp 和 0.2个ulp。这里的 0.8 和 0.2 就是 ulps 的数量。

理解了ulps 的数量之后,再理解整句话就简单多了。函数都有输入和输出嘛,不同的输入一般对应不同的输出,所以也就对应着不同的误差大小。假设某一个函数在任何输入下产生的输出误差都不会大于 0.5 ulps ,那么这个函数在 “任何参数下最坏情况的误差” 就是 0.5 ulps!这个函数的 “所引用的 ulps 的数量 就是 0.5 ulps!

第三:“如果某个函数的错误始终小于0.5 ulps,则该函数始终返回最接近精确结果的浮点数,这样的函数是正确舍入的。”

理解了上面的内容后,这句话也比较好理解了。对于一个函数,不同的输入会产生不同的误差,如果函数在任何情况下产生的误差总是小于 0.5 ulps。那么说明这个函数总是能够返回最接近精确结果的近似值。这样的函数是正确舍入的。

那什么是错误舍入的函数呢,就是当这个函数有时候的误差小于 0.5 ulps 有时候的误差大于 0.5 ulps。那么这个函数是个不合格的函数,也就是错误舍入的函数。

为什么以 0.5 ulps 为判断函数的标准呢。这个也很好解释。 函数的精确解设为:

res res

res 精确解左边的最近的浮点数设为:

res左 res_左

res左? 精确解右边的最近的浮点数设为:

res右 res_右

res右? 那么一个好的函数,当然要尽可能使误差最小化:

errormin=min(∣res?res左∣,∣res?res右∣) error_{min} = min(|res - res_左|, |res - res_右|)

errormin?=min(∣res?res左?∣,∣res?res右?∣)

由下图 可知,在任何情况下,最小误差都不会小于 0.5 ulps,也就是:

MAX(errormin)=0.5ulps MAX(error_{min}) = 0.5 ulps

MAX(errormin?)=0.5ulps

所以以0.5 ulps 作为评判标准。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3