2012-09-13 18 views
1

我有一个符合规范的信号处理库。但是,我已经确定了一些重构的好地方。我一直有意将单元测试合并到我的工作流程中一段时间​​,这看起来像是一个很好的机会来尝试使用非平凡的代码。这样我就可以测试重构后的输出接近完全相同。当单元测试浮点信号处理库时出现错误界限

我与catch试验作为测试框架,但是,这个细节可能是无关紧要的(从我可以收集)的所有测试框架周围结果铰链由运营商,即

REQUIRE(i_x == 2) 

然而,浮动点数据,则需要某种形式的错误边界检查。 。

const float target = 2.000f; 
const float tolerance = 0.000005f; 
const float err = target*tolerance; 
REQUIRE((f_x > target-err) && (f_x < target+err)) 

这将很快得到丑陋的人,写的每一个测试,这样我就可以,当然,作出这样的返回(模板化)全局函数boolxtargettolerance作为参数。

这是所有人都这样做的方式吗?这是最佳做法还是我错过了一个窍门?

+0

我不确定最佳实践是什么,但这就是我所做的......'附近(浮动实际,浮动预期,浮动公差)' –

回答

4

测试对上下文高度敏感。你提出的测试测试相对误差。实质上,你声称在这种特殊情况下:

  • 正常的,可接受的代码更改可能会在每个结果中产生相对于结果较小的偏差。
  • 错误可能会产生相对于结果不小的偏差。

总之,我认为第二个断言通常是安全的。 “随机”代码更改可能会在至少某些值上产生巨大差异。但是,有些应用程序可以很好地处理浮点运算,在这种情况下,小的偏差可能导致超出规范的结果。例如,假设您有一个反正弦例程,该例程返回的结果与正确的结果稍有不同:当正确结果为1时,返回1 + 2 -23。稍后,此结果x用于表达式为sqrt(1-x*x)。该表达式对于所有数学上正确的反正弦值(对于实际输入)是真实的,但是,给定略大于1的x时,它会尝试取负数的平方根,并发生错误。所以你必须决定第二个断言是否适合你的应用程序。

第一个断言更可疑。浮点算术中的误差源并不总是与最终结果成比例的。例如,考虑对某些输入信号进行离散傅立叶变换(DFT)。对于几乎每个输出编号,每个输入编号都会贡献一些部分。偶然的情况下,一些单独的输出数字将接近于零。但是,它们中的错误可能与输入中的大数成正比。因此,对这些输出数字应用相对误差测试会产生错误的错误指示。相反,有必要允许输入以某种方式缩放的错误。

相关问题