Matlab中浮点数比较的最佳实践

zui*_*iqo 14 floating-point matlab

显然浮动比较总是很棘手.我在我的(科学)代码中有很多断言检查,所以我经常要检查总和是否相等,以及类似的问题.

是否有快速简便/最佳实践方式来执行这些检查?


我能想到的最简单的方法是为固定容差浮点数比较建立一个自定义函数,但这对我来说似乎很难看.我更喜欢内置的解决方案,或者至少是非常清晰和易于理解的东西.

感谢您的输入!

Pho*_*non 10

我认为这很可能是你自己写的一个功能.我经常使用三件事来运行计算矢量测试,可以这么说:

最大绝对误差

return max(abs(result(:) - expected(:))) < tolerance
Run Code Online (Sandbox Code Playgroud)

这会逐点计算最大绝对误差,并告诉您是否小于某个容差.

最大错误计数

return sum( (abs(result(:) - expected(:))) < tolerance )
Run Code Online (Sandbox Code Playgroud)

这将返回超出公差范围的点数.修改返回百分比也很容易.

均方根误差

return norm(result(:) - expected(:)) < rmsTolerance
Run Code Online (Sandbox Code Playgroud)

由于存在这些和许多其他标准用于比较浮点数组,我建议编写一个接受计算结果,预期结果,容差和比较方法的函数.通过这种方式,您可以使您的支票非常紧凑,并且比试图解释您在评论中所执行的操作要简单得多.

  • 使用"eps"来表示容差通常是一个好主意.此外,R2013a及其后续单元测试框架中的assertEqual语句将有所帮助. (4认同)

Dan*_*iel 9

如果你输入非常大或非常小的数字,任何固定的公差都将失败,最简单的解决方案是eps用来获得双精度:

abs(A-B)<eps(A)*4
Run Code Online (Sandbox Code Playgroud)

4是完全任意的数字,这在大多数情况下是足够的.


Mar*_*cin 5

不知道解决方案中的任何特殊构建.也许使用eps功能的东西?

例如,您可能知道这将给出False(即0)结果:

>> 0.1 + 0.1 + 0.1 == 0.3

ans =

     0
Run Code Online (Sandbox Code Playgroud)

但是使用eps,您可以执行以下操作,结果如预期:

>> (0.1+0.1+0.1) - 0.3  < eps     

ans =

     1
Run Code Online (Sandbox Code Playgroud)

  • 你应该将数量级传递给'eps`,因为`eps(10000)`大于'eps(1)`,默认值. (2认同)