2011-09-26 127 views
5

我有一個小函數,應該根據機器學習算法進行預測。該函數不起作用,所以我在打印語句中檢查值,並突然開始工作。當我註釋掉打印行時,它會再次停止工作。有什麼我錯過了爲什麼會發生?爲什麼打印一個變量會改變它的值?

int makePrediction(const InstanceT & instance, bool biased){ 
    double dotProduct = (biased ? instance * _weights + _bias : instance * _weights); 
    std::cout << "dotProduct = " << dotProduct << std::endl; 
    return (dotProduct > 0 ? 1 : -1); 
} 

由於某些原因產生不同的結果,那麼

int makePrediction(const InstanceT & instance, bool biased){ 
    double dotProduct = (biased ? instance * _weights + _bias : instance * _weights); 
    return (dotProduct > 0 ? 1 : -1); 
} 

,並表明其結果是不同的給予相同的投入,我調用這個函數有:

std::vector<InstanceT> _instances = populate_data() //this works for both versions 
for (int i = 0; i < _instances.size(); i++){ 
    std::cout << "prediction: " << makePrediction(_instances[i], true) << std::endl; 
} 

有什麼想法?

+0

好的問題codereview.stackexchange.com –

+2

你是什麼意思的「不工作」?預期和觀察到的行爲是什麼?請指定確切的輸入和輸出。 –

+0

std :: endl通常也會刷新。您的調用代碼是否產生取決於cout緩衝區狀態的輸出?似乎不太可能。輸出實際上有多不同;什麼是「makePrediction」的正確值,它在錯誤時給出了什麼? –

回答

4

這種情況經常發生由於兩方面的原因:

  1. 併發問題。如果你的程序是多線程的,你可以用調試輸出來掩蓋競爭條件。嘗試一下像helgrind這樣的MT調試器。
  2. 損壞的堆棧。嘗試在你的程序上運行valgrind,看看它是否乾淨。

這些當然是非常通用的建議,但是您必須更好地指定您的問題才能獲得更好的建議:-)。

+0

The代碼不是多線程的,所以它不應該是一個併發問題。並回答一些其他評論者,關於發佈結果:實質上,如果給定相同的輸入(這兩個參數以及類中的數據成員都相等),則代碼將同時生成打印語句的+1和-1,但只有當print語句結束時纔會生成-1。 – Max

+0

@Max:我想你錯過了評論者的主要觀點。給出一個「失敗」的具體例子。一個我可以編譯的代碼,它會重現這個問題。你有一些醜陋的錯誤,但如果你不努力,沒有人能幫助你。 –

+0

問題是,我不知道如何提供一個很好的例子,因爲這是一個更大代碼結構的一部分,它依賴於來自單獨文件的數據集。我不知道如何在不包含所有代碼的情況下生成一個好例子。 – Max

相關問題