在浮点比较中选择ULP值

时间:2019-05-15 17:05:03

标签: c++ floating-point

我已经阅读了网络上的一些资源,并且我了解比较浮点数时没有单个值或通用参数。我已经阅读了from here的几封回复,并从Google测试中找到了比较浮点数的代码。我想更好地理解ULP的含义及其价值。从源代码中读取注释:

  

单个浮点运算的最大误差为0.5单位   最后的地方。在Intel CPU上,所有浮点计算都为   以80位精度完成,而double具有64位。因此,4   应该足够普通使用。

目前尚不清楚为什么“因此4个就足够了”。谁能解释为什么?根据我的理解,我们说我们可以容忍4 * 10 ^ -6或4 * 10 ^ -15作为我们的数字之间的差异,以考虑到浮点数的有效位数(6)来表示它们是否相同。 / 7)或加倍(15/16)。正确吗?

1 个答案:

答案 0 :(得分:3)

这是错误的。错了考虑到每个操作都会累积一些误差-½ULP是最大值(在最近舍入模式下),因此¼可能是平均值。因此,仅凭平均效果就可以进行17次操作,累积超过4个ULP错误。 1 当今的计算机每秒执行数十亿次操作。一个程序在其输入和以后的比较之间将执行多少次操作?这取决于程序,但仅用于“常规”使用时可以为零,数十,数千或数百万。 (假设我们排除了数十亿美元,因为这样一来,人类使用起来就会很慢,因此我们可以称其为专用软件,而不是普通软件。)

但这还不是全部。假设我们在1附近加上一些数字,然后减去恰好在总和附近的数字。也许加法会得到大约2 ULP的总误差。但是当我们减去时,结果可能大约是2 −10 而不是1。因此2 −10 的ULP比1的ULP小1024倍。相对于1为2 ULP的误差相对于相减结果为2048 ULP。糟糕! 4 ULP不会削减它。在涉及的其他一些数字中,它应该是4 ULP,而不是结果的ULP。

实际上,通常很难对错误进行特征描述,并且这是整个研究领域的主题,numerical analysis。 4不是答案。

脚注

1 错误的方向会有所不同,因此有些错误会被消除。该行为可能被建模为随机游走,平均误差可能与所执行操作数的平方根成比例。