显然,浮动比较总是很棘手。我的(科学)代码中有很多断言检查,所以我经常要检查总和是否相等,以及类似的问题。
是否有快速简便/最佳实践方式来执行这些检查?
我能想到的最简单的方法是为固定容差浮点数比较构建一个自定义函数,但这对我来说似乎很难看。我更喜欢内置的解决方案,或者至少是非常清楚和直接理解的东西。
答案 0 :(得分:10)
我认为这很可能是你自己写的一个功能。我经常使用三件事来运行计算矢量测试:
最大绝对误差
return max(abs(result(:) - expected(:))) < tolerance
这会逐点计算最大绝对误差,并告诉您是否小于某个容差。
最大错误次数
return sum( (abs(result(:) - expected(:))) < tolerance )
返回超出公差范围的点数。修改返回百分比也很容易。
均方根误差
return norm(result(:) - expected(:)) < rmsTolerance
由于存在这些和许多其他标准用于比较浮点数组,我建议编写一个接受计算结果,预期结果,容差和比较方法的函数。通过这种方式,您可以使您的支票非常紧凑,并且比试图解释您在评论中所执行的操作要简单得多。
答案 1 :(得分:9)
如果您输入非常大或非常小的数字,任何固定的容差都将失败,最简单的解决方案是使用eps
来获得双精度:
abs(A-B)<eps(A)*4
4是一个完全任意的数字,在大多数情况下就足够了。
答案 2 :(得分:5)
不知道解决方案中的任何特殊构建。也许使用eps函数的东西?
例如,您可能知道这将导致False(即0
):
>> 0.1 + 0.1 + 0.1 == 0.3
ans =
0
但是使用eps,您可以执行以下操作,结果符合预期:
>> (0.1+0.1+0.1) - 0.3 < eps
ans =
1
答案 3 :(得分:0)
我对使用Matlab的单元测试框架xUnit有很好的经验。安装后,您可以使用:
assertVectorsAlmostEqual(a,b)
(检查 normwise 矢量之间的接近度;可配置的绝对/相对容差和合理的默认值)assertElementsAlmostEqual(a,b)
(相同的检查,但每个条目都是元素 - 所以[1 1e-12]
和[1 -1e-9]
将与前者比较,但与后者不同。它们经过良好测试,使用快速且清晰度足以阅读。函数名称很长,但是对于任何不错的编辑器(或者Matlab编辑器),你可以将它们写成assertV<tab>
。
答案 4 :(得分:-2)
对于那些同时理解MATLAB和Python(NumPy)的人来说,检查以下Python函数的代码可能会很有用:
numpy.allclose(a, b, rtol=1e-05, atol=1e-08)
numpy.isclose(a, b, rtol=1e-05, atol=1e-08, equal_nan=False)