2012-08-22 12 views
11

Il programma C++ riportato di seguito dovrebbe restituire un valore estremamente positivo. Tuttavia, restituisce 0.Prodotto interno zero quando si utilizza std :: inner_product

Cosa succede? Sospetto una conversione int doppia, ma non riesco a capire perché e come.

#include <iostream> 
#include <vector> 
#include <numeric> 
using namespace std; 
int main() 
{ 

    vector<double> coordinates; 
    coordinates.push_back(0.5); 
    coordinates.push_back(0.5); 
    coordinates.push_back(0.5); 

    cout<<inner_product(coordinates.begin(), coordinates.end(), coordinates.begin(), 0)<<endl; 

    return 0; 
} 
+3

Chuckle. Anche quello mi ha preso una volta. –

risposta

13

Poiché è stato fornito un valore iniziale di 0, un int. Il tuo codice è internamente equivale a:

int result = 0; 

result = result + 0.5 * 0.5; // first iteration 
result = result + 0.5 * 0.5; // second iteration 
result = result + 0.5 * 0.5; // third iteration 

return result; 

Mentre result + 0.5 * 0.5 produce il valore corretto (result è promosso a double in questa espressione), quando tale valore viene assegnato di nuovo in result, è troncato (che l'espressione è gettato a int) . Non si ottiene mai sopra 1, quindi è possibile vedere 0.

Assegnare invece un valore iniziale di 0.0.

3

Questo perché è stato fornito zero come costante intera. Le operazioni risultanti sono tutte in numeri interi, pertanto il valore finale (0.75) viene troncato anche a int.

Change zero a 0.0 per farlo funzionare:

cout << inner_product(coord.begin(), coord.end(),coord.begin(), 0.0) << endl; 

Questo produce 0.75 su ideone.

+0

In realtà, non supera mai lo 0,25 prima di tornare a zero. Ho coniato una parola. –

Problemi correlati