gpt4 book ai didi

c++ - 单元测试浮点信号处理库时的错误界限

转载 作者:行者123 更新时间:2023-11-30 02:03:08 25 4
gpt4 key购买 nike

我有一个信号处理库,其功能符合规范。但是,我已经确定了一些重构的好地方。一段时间以来,我一直想将单元测试合并到我的工作流程中,这看起来是一个试验重要代码的好机会。这样我就可以测试重构后的输出是否几乎相同。

我正在试验 catch然而,作为一个测试框架,这个细节可能无关紧要,因为(据我所知)所有测试框架都围绕着运营商的结果,即

REQUIRE(i_x == 2)

但是,对于 float 据,需要某种形式的错误边界检查。 .

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

对于编写的每个测试,这很快就会变得丑陋,所以我当然可以制作一个(模板化的)全局函数,它返回一个给定 xbooltargettolerance 作为参数。

其他人都这样吗?这是最佳做法还是我错过了一个技巧?

最佳答案

测试对上下文高度敏感。您建议的测试测试相对误差。本质上,您是在断言,在这种特定情况下:

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

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

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

关于c++ - 单元测试浮点信号处理库时的错误界限,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12404214/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com