当参数为真时,C ++断言失败

时间:2016-11-20 05:50:52

标签: c++ unit-testing assert

我正在用C ++编写一些统计函数,特别是校正样本标准差函数。我还编写带有断言的测试套件,以确保我的代码按预期工作。我使用在线计算器预先确定我的测试套件的正确值,并使用assert关键字检查我的stdev函数的输出值。我还打印出了函数输出的值,它们与我在assert语句中设置的值相同。断言应该都是真的,因为我基本上运行断言(c == c)但总是失败。我在这里给我的测试套件以及我的stdev功能。

void test_stdev_function() {
  vector<double> v1, v2, v3, v4;
  v1 = {0, 1, 2};
  v2 = {1, 1, 1};
  v3 = {-2, -1, 1, 2};
  v4 = {1, 1, 1, 10};
  assert(stdev(v1) == 1);
  assert(stdev(v2) == 0);
  assert(stdev(v3) == 1.82574);
  assert(stdev(v4) == 4.5);
  cout << "function stdev pass!" << endl;
}

double stdev(std::vector<double> v)
{
    double sum_square_diff = 0;
    double avg = 0;
    double sum = 0;
    int n = v.size();
    for (std::vector<double>::iterator itr = v.begin(); itr != v.end(); ++itr) {
        sum+=*itr;
        cout << "sum = " << sum << "  *itr = " << *itr << endl;
    }
    avg = sum / n;
    cout << "avg = " << avg << "    ";
    for (std::vector<double>::iterator itr = v.begin(); itr != v.end(); itr++) {
        sum_square_diff+=pow((*itr - avg), 2);
    }
    double stdev = sqrt(sum_square_diff / (n-1));
    cout << "stdev = " << stdev << endl;
    return stdev;
}

任何人都知道为什么断言语句会失败?

2 个答案:

答案 0 :(得分:2)

这样的事情可以解释浮点不确定性:

assert((fabs(stdev(v3) - 1.82574) < 0.00001));

答案 1 :(得分:1)

前两个断言有效,因为stdev返回值是整数。第三个失败是因为从stdev返回的小数位数与您编写的小数位数不同。比较失败并断言调用abort()。