在课堂上测试很多数学运算

时间:2012-02-14 11:14:21

标签: c++ unit-testing math

有没有一种方法可以轻松地在类中测试函数以获得正确的结果?我的意思是,我一直在看谷歌测试单元测试,但似乎更多的是在工作类和功能中发现失败,超过了预期的结果。

例如,从数学理论可以知道哪个是所有数字的平方根,现在你想检查一个sqrt函数,寻找浮点精度误差,然后你还想检查很多使用浮点数的函数并寻找任何精度错误,有没有办法使这容易和快速?

2 个答案:

答案 0 :(得分:1)

您对精度有要求还是想要找到精度? 如果它是前者,那么使用任何测试框架创建测试用例并不困难。

y = myfunc(x);
if (y > expected_y + allowed_error || y < expected_y - allowed_error) {
  // Test failed
  ...
}

修改 通过测试和算法分析,有两种途径可以找到精度。

测试应该很简单:将输出与正确的值(您必须以某种方式获得)进行比较。

算法分析是指通过计算算法的误差和浮点运算中缺乏精度导致的误差来计算误差的预期大小。

答案 1 :(得分:1)

我能想到2个直接解决方案

1)

测试数学函数准确性的最简单方法之一类似于用于微积分限制的定义工作。获取要测试的值,然后使用两侧“接近”的值。我听说过极限分析和单元测试之间的类比,但请记住,如果你寻找速度,这将不是你最好的选择。并且这只适用于继续操作,并且这个类比仅用于定义工作

所以你要做的就是为每个函数定义一个“limitDomain”变量(这是因为某些操作比其他操作更准确,因为推理查找了[函数]的taylor近似值),然后使用它作为限制器。然后测试:低,高,然后是值本身,然后在给定的误差范围内取所有三个的平均值,

float testMathOpX(float _input){
    float low = 0.0f;
    float high = 0.0f;

    low = _input - limitDomainOpX;
    high = _input + limitDomainOpX;

    low = OpX(low);
    _input = OpX(_input);
    high = OpX(high);

    // doing 3 separate averages with division by 2 mains the worst decimal you will have is a trailing 5, or in some cases a trailing 25
    low = (low + _input)/2
    high = (_input + high)/2;
    _input = (low + high)/2
    return _input;
}

2)

我能想到的另一种方法更多的是一个值表的方法,即你接受输入,然后检查它所在的操作域的位置,以及它是否在某些值内,那么你使用价值替代。要意识到的是,你需要提前做大量的工作来获得这些价值表,然后它就会变成对你所接受的价值的域名测试:

if( (_input > valLow) && (_input < valHigh)){
     ... replace the value with an empirically found value
}

这个问题是你需要找到那些经验上找到的值。