2011-09-26 15 views
5

Ho una piccola funzione, che dovrebbe fare una previsione basata su un algoritmo di apprendimento automatico. La funzione non funzionava, quindi ho inserito una dichiarazione di stampa per controllare il valore e all'improvviso ha iniziato a funzionare. Quando commento la linea di stampa, smette di funzionare di nuovo. C'è qualcosa che mi manca perché questo sarebbe successo?Perché stampare una variabile modifica il suo valore?

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

per qualche ragione produce un risultato diverso poi

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

e per dimostrare che i risultati sono diversi a parità di input, chiamo questa funzione con:

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

Dei pensieri ?

+0

Buona domanda per codereview.stackexchange.com –

+2

Cosa intendi per "non funzionava"? Qual è stato il comportamento previsto e osservato? Si prega di specificare l'input e l'output esatti. –

+0

std :: endl di solito scarica anche. Il tuo codice chiamante produce output che dipende dallo stato del buffer di cout? Sembra improbabile. Quanto è effettivamente diverso l'output; qual è il valore corretto di 'makePrediction' e cosa dà quando è sbagliato? –

risposta

4

Questo accade spesso a causa di due motivi:

  1. problemi di concorrenza. Se il programma è multithreading, si mascherano le condizioni di gara con l'output di debug. Prova un debugger di MT come helgrind.
  2. Pile rotte. Prova a eseguire valgrind sul tuo programma e vedere se esce pulito.

Questi sono, ovviamente, consigli piuttosto generici, ma dovrai specificare meglio la tua domanda per ottenere un consiglio migliore :-).

+0

The il codice non è multithread, quindi non dovrebbe essere un problema di concorrenza.E per rispondere ad alcuni degli altri commentatori, sulla pubblicazione dei risultati: in sostanza, dati gli stessi input (sia i parametri che i membri dei dati nella classe che sono uguali), il codice produce sia +1 che -1 con l'istruzione print in, ma produce solo -1 quando l'istruzione di stampa è esaurita. – Max

+0

@Max: Penso che tu abbia perso il punto principale dei commentatori. Fai un esempio concreto in cui "fallisce". Un codice che posso compilare e che riprodurrà il problema. Hai qualche brutto bug, ma se non ti sforzi, nessuno può aiutarti. –

+0

Il problema è che non so come fornire un buon esempio, perché questo fa parte di una struttura di codice più grande, che si basa su un set di dati da un file separato. Non so come produrre un buon esempio senza includere tutto il codice. – Max

Problemi correlati