繁体   English   中英

在双精度列表中找到最大数,是否需要关注精度?

[英]find the max one number in a list of double, need to care about precision?

假设有一个向量,并且需要找出最大数。 我的同事告诉我,必须以特殊方式处理双数,他的代码如下:

double max = v[0];
for (int i = 0; i < v.size(); ++i) {
   if (compare(max, v[i]) < 0) max = v[i];
}

int compare(double a, double b) {
    double z = a - b;
    if (z < -0.000001) return -1;
    if (z > 0.000001) return 1;
    return 0;
}

我认为它不需要那么复杂,只需使用'<'或'>'就可以完成工作,它不必关心相等。 但是我的同事坚持认为,与epsilon比较必须找出最大数量。 真的吗?

为了找到最大的数字,您是对的,简单的<就足够了。

您的同事在想(无论如何,我们希望)正在处理浮点数的相等性。 例如,如果您以两种不同的方式计算应为相同值的值,则可能会轻易看到两者之间的微小差异-即使(a+b)+ca+(b+c)也会改变a结果(即使从数学角度来看,两者应相同)。

但是,执行此操作时,通常需要根据数字的大小来缩放数字之间允许的差异。

例如,让我们考虑一个可以代表大约15个有效数字的double精度数。

如果您的数字在1e + 200左右,则可以表示的这两个数字之间的最小差约为1e + 185。 问差是否小于0.000001小是没有意义的-无论结果是相同的,否则差比大得多

相反,如果您的数字在1e-200左右,则可以表示的数字之间的最小差约为1e-215。 再次考虑到0.000001的差异是完全荒谬的-仅在两个计算之一的错误程度约为196个数量级1时才会发生。

因此,要执行此操作,请在小数点后选择一些需要匹配的位置,以使您认为这两个位置相等,然后将其乘以数字即可得到最大增量。 例如,如果您决定他们需要同意小数点后7位,并且数字在1eN的范围内,则最大差值为1e(N-7)。 如果N为100,则最大增量为1e93。 如果N为-150,则最大增量为1e-157。

仍然需要非常小心地使用它,尤其是在处理数字组时。 问题是这样的近似相等不再具有传递性。 即使数字处于0.000001的Epsilon可能有意义的范围内,也可以说A == B,并且B == C,但是A!=C。这可能会导致非常令人惊讶的结果轻度(在某些情况下,例如排序,可能会导致完全失败,因为您违反了严格的弱排序要求)。

就查找在向量中找到最大值的原始问题而言,这基本上意味着仅使用<找到实际上最大的值。 根据舍入误差,但是,有可能是较小的其他值,但理论上应该是较大的。 根据这些结果的计算方式和您要完成的工作,您可能要考虑不仅查找最大的单个值,而且查找选定的最大错误最大值内的所有其他值。 其他的值虽然不那么大,但足够接近,可以代表最大的度量值(或您正在使用的任何精确值)。

还有一点可能值得一提:一些浮点格式包括“不是数字”的表示形式。 这对于每次可能的比较都会产生false (实际上,检测NaN的常见方法是if (x != x) /* it's a NaN */ )。 因此,如果您的输入值可能包含NaN,则看似相同的比较可能会得出完全不同的结果。 例如, if x < y并且if not y >= x通常应该是相同的,但是如果xy是NaN,则它们不会相同。


  1. 为了尝试将196个数量级视为透视图,让我们假设您正在进行计算,试图将中子的大小与质子的大小进行比较。 然后,您决定检查这两个大小之间的差异是否大于银河系的直径。

    哦,但这不是196个数量级。 大约只有36个数量级。 因此,让我们检查一下我们得到的差值是否大于(当前认为的)宇宙直径。 这使我们上升到大约50个数量级。

    我想我虽然未能正确地将其放到视野中,即使我们将弦论归因于“弦”的最小尺寸与宇宙的(通常被接受的)尺寸进行比较,两者仍然存在。相差196个数量级。 更糟糕的是,我怀疑字符串的大小或已知宇宙的大小是否是任何人都可以真正有意义地可视化的东西。 一个太小了,另一个太大了,任何人都无法真正掌握,两者之间的差异仍然远远小于我们在谈论的差异。

您的同事是错误的,在这种情况下,操作<结果就足够了。 如果您需要找出容器等中有多少个最大元素,则有必要与epsilon进行比较。只需找到一个简单元素即可。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM