3

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

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

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

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

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

4

1 回答 1

3

公差规范是一项业务功能。没有标准说“所有公差必须在 +/- .001% 以内”。因此,您必须满足您的要求并找出适合您的方法。

看看你的申请。假设它用于某种切割机。它们是金属加工公差吗?0.005 英寸很常见。他们是木柜锯切公差吗?1/32" 是马虎的,1/64" 更好。他们是房屋框架公差吗?不要指望木匠会接近 1/4"。用焊枪手工切割?希望大约一英寸。关键是每个应用程序都依赖于不同的东西,即使他们正在做相同的事情。

如果你只是在谈论一般的“双打”,它们通常不会超过 15 位的精度。浮点数可以达到 7 位数。当我考虑这个问题时,我将它们四舍五入(我不依赖一个双精度超过 14 位的数字,我以六位浮点数停止);但是,如果我担心超过第 12 位的精度,我通常会处理必须精确平衡的大量美元,而对它们使用非整数数学是个傻瓜。商界人士希望他们的东西平衡到一分钱,并且不赞成四舍五入加法运算!

如果您正在查看诸如三角函数之类的数学库操作,请阅读有关每个函数的库文档。

于 2013-10-09T22:36:48.987 回答