我已经阅读了网络上的一些资源,并且我了解比较浮点数时没有单个值或通用参数。我已经阅读了from here几个回复,并且从Google测试中找到了比较浮点数的代码。我想更好地理解ULP的含义及其值(value)。从源代码中读取注释:
尚不清楚为什么“因此4应该足够”。谁能解释为什么?根据我的理解,我们说我们可以容忍4 * 10 ^ -6或4 * 10 ^ -15作为我们的数字之间的差异,以考虑到浮点数的有效位数(6) / 7)或加倍(15/16)。这是正确的吗?
最佳答案
这是错误的。错了考虑到每个操作都会累积一些误差-1/2 ULP是最大值(在最近舍入模式下),因此¼可能是平均值。因此,仅凭平均效果就可以进行17次操作,累积出4个以上的ULP错误。1今天的计算机每秒执行数十亿次操作。一个程序在其输入和以后的比较之间将执行多少次操作?这取决于程序,但仅用于“常规”使用时可以为零,数十,数千或数百万。 (假设我们排除了数十亿美元,因为这样一来,人类使用起来就会很慢,因此我们可以称其为专用软件,而不是普通软件。)
但这还不是全部。假设我们在1附近加上一些数字,然后减去恰好在总和附近的数字。也许加法会得到大约2 ULP的总误差。但是当我们减去时,结果可能约为2-10,而不是1。因此2-10的ULP比1的ULP小1024倍。相对于1的2 ULP的误差相对于1的2048 ULP。减法的结果。糟糕! 4 ULP不会削减它。在涉及的其他一些数字中,它应该是4 ULP,而不是结果的ULP。
实际上,表征错误通常很困难,并且是整个研究 Realm numerical analysis的主题。 4不是答案。
脚注
1错误的方向会有所不同,因此有些错误会被消除。可以将行为建模为随机游走,并且平均误差可能与执行的操作数的平方根成比例。