ulp(unit in the last place)是什么意思
ULP
百度上的资料非常少,我总结了我查到的相关资料,希望帮助到大家理解。若有解释不当的地方,欢迎指正!
ULP(Unit in the last place)是计算机科学中的一个误差单位。
想要理解什么是ULP就需要了解浮点数的原理,本篇文章不做解释,网上的资料很多,这里贴个链接:
下面开始介绍ULP
单个实数值的ULP定义与计算
定义:对于给定的浮点格式,特定实数值的 ulp 是与此实数值左右最近的两个浮点数的距离。
以IEEE754标准的32位浮点数为例。如果想表示实数值 0.1 是无法准确表示的,只能用最接近 0.1 的可以精确表示的浮点数来表示。这样的数有两个,设为A、B,它们的十六进制和十进制表示分别为:
A:
十六进制: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 为判断函数的标准呢。这个也很好解释。
函数的精确解设为:
精确解左边的最近的浮点数设为:
精确解右边的最近的浮点数设为:
那么一个好的函数,当然要尽可能使误差最小化:
由下图
可知,在任何情况下,最小误差都不会小于 0.5 ulps,也就是:
所以以0.5 ulps 作为评判标准。