2016-11-20 10 views
0

C++でいくつかの統計関数、特に修正されたサンプル標準偏差関数を書いています。また、私のコードが期待通りに動作することを確認するために、アサーション付きのテストスイートを作成します。私は、オンライン計算機を使用して、テストスイートの正しい値を事前に決定し、assertキーワードを使用してstdev関数の出力値と比較します。私はまた、私の関数出力の値を出力しました。それらは、私がそれらをassertステートメントの中に入れるように設定したものと同じです。基本的にassert(c == c)を実行しているので、assertsはすべて真実であるべきですが、常に失敗します。私はここで私のテストスイートと私のstdev機能を与えています。引数がtrueのときに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; 
} 

アサート文が失敗し続ける理由を誰もが知っていますか?

+0

理解しないでください。もしあなたができるなら、少なくとも私を助けてください。私が十分具体的でないなら、私はもっと詳細にしようとします。私はかなりの研究とデバッグを行いましたが、まだこれを理解することができませんでしたので、これは私の最後の希望です。 –

+0

あなたはただ推測しましたか(c == c)? –

+0

あなたは何を意味するのかよく分かりません。私はassert(c == c)を類推として使用し、各stdev値の値を2倍にして、assert引数の数値と正確に一致するようにしたので、最初のassert文でassert(1 == 1)完璧には良いですが、3番目と4番目のアサートは失敗しました。 –

答えて

1

stdevの戻り値は整数なので、最初の2つは動作します。 3番目のものは、stdevから返された小数点以下の桁数があなたが書いたものと異なるため、失敗します。比較が失敗し、呼び出しがアボート()されます。このような

2

何かが浮動小数点の不確実性を説明することができる:あなたvotes..ifダウンはこれがばかな質問の罰金だと思う理由

assert((fabs(stdev(v3) - 1.82574) < 0.00001)); 
関連する問題