双重比较的良好容忍度

时间:2013-10-09 19:05:20

标签: unit-testing comparison floating-point-precision

在单位测试中比较双打时,我试图提出一个良好的容忍度。

如果我允许我在本网站上看到的固定容差(例如return abs(actual-expected) < 0.00001;),由于浮点表示的性质,当数字非常大时,这通常会失败。

如果我在允许的%误差方面使用相对容差(例如return abs(actual-expected) < abs(actual * 0.001);,这对于小数字来说经常失败(对于非常小的数字,计算本身可能会引入舍入误差)。此外,它也允许在某些范围内有很大的容忍度(例如,比较2000年和2001年将会通过)。

我想知道是否有任何标准算法允许公差适用于小数和大数。我应该尝试某种基本的2对数容差来镜像浮点存储吗?我应该根据输入的大小进行混合方法吗?

由于这是单元测试代码,性能不是一个重要因素。

1 个答案:

答案 0 :(得分:2)

容忍规范是一项业务功能。没有标准说“所有公差必须在+/- .001%之内”。所以你必须按照你的要求找出适合你的方法。

查看您的申请。让我们说它适用于某种切割机。它们是金属加工公差吗? .005英寸很常见。它们是木柜锯切公差吗? 1/32“是马虎,1/64”更好。它们是框架公差吗?不要指望一个木匠靠近1/4“。用焊枪手工切割?希望大约一英寸。重点是每个应用程序都依赖于不同的东西,即使它们做的是同等的东西。 / p>

如果你只是在谈论“双打”,那么它们通常是好的,不会超过15位精度。浮动很好7位数。当我在思考这个问题时,我将它们减去一个(我不依赖于一个双精度到14位以上的数字而且我用六位数的浮点数停止);但是,如果我担心超过第12位的精度,我通常会使用大量的金额来精确地平衡,而且我会非常愚蠢地使用非整数数学。商界人士希望他们的东西与便士保持平衡,并且不会赞成完成额外操作!

如果您正在查看数学库操作(如trig函数),请阅读每个函数的库文档。