在单元测试中比较双打时,我试图提供一个良好的容忍度。
如果我允许在此站点上提到的固定公差(例如return abs(actual-expected) < 0.00001;
),则由于浮点表示的性质,当数字很大时,这通常会失败。
如果我使用允许的误差百分比表示相对公差(例如,return abs(actual-expected) < abs(actual * 0.001);
,则对于较小的数字(通常对于非常小的数字,此运算本身会引入舍入误差)会经常失败)。此外,在某些范围内允许的公差也太大(例如,比较2000年和2001年就会过去)。
我想知道是否有任何标准算法允许公差适用于小数和大数。我是否应该尝试某种以2为底的对数公差来镜像浮点存储?我是否应该根据输入量进行混合处理?
由于这是在单元测试代码中,因此性能不是很大的因素。
最佳答案
公差的规范是一项业务功能。没有标准说“所有公差必须在+/- .001%之内”。因此,您必须满足自己的要求,并找出适合您的方法。
查看您的应用程序。假设它是用于某种切割机的。它们是金属加工公差吗? 0.005英寸很常见。他们是木柜锯切公差吗? 1/32英寸草率,1/64英寸更好。他们是房屋框架公差吗?难道木匠不会比1/4英寸更近。用焊枪进行手工切割吗?希望约一英寸。关键是每个应用程序都取决于不同的东西,即使他们做的是相同的事情。
如果您一般来说只是在说“双精度”,则通常精度不超过15位。浮点数可以达到7位数字。在考虑问题时,我会将它们四舍五入(我不依赖于精度超过14位数字的双精度数,而我以六位数的浮点数停止);但是,如果我担心精度超过12位数字,我通常会使用大量的美元,而这些美元必须要精确地进行平衡,而对它们使用非整数数学将是我的傻瓜。商界人士希望他们的东西平衡到一分钱,并且不赞成四舍五入的加法运算!
如果您正在查看Trig函数之类的数学库操作,请阅读每个函数的库文档。