2016-11-20 140 views
0

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

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; 
} 

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

+0

不明白为什么votes..if你向下认为这是一个愚蠢的问题罚款。至少帮助我,如果你可以或者如果我不够具体让我知道我会尽量做得更详细。我已经做了相当多的研究和调试,但仍然无法弄清楚,所以这是我最后的希望,认真。 –

+0

你只是猜测断言(c == c)? –

+0

我不太明白你的意思。我用assert(c == c)作为类比,我检查了每个stdev值的值,并且它们与我的assert参数中的数值完全匹配,因此,在第一个assert语句中assert(1 == 1)这是完全正确的,但第三次和第四次断言失败。 –

回答

1

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

2

像这样的东西可以解释浮点不确定性:

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