2016-11-20 128 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));