2012-08-22 14 views
11

El programa C++ a continuación debe devolver un valor estrictamente positivo. Sin embargo, devuelve 0.Producto interno cero al usar std :: inner_product

¿Qué ocurre? Sospecho que se trata de una conversión doble, pero no entiendo por qué y cómo.

#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. Ese me consiguió una vez también. –

Respuesta

13

Porque ha proporcionado un valor inicial de 0, un int. Su código es internamente equivalente 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; 

Mientras result + 0.5 * 0.5 produce el valor correcto (result se promueve a double en esta expresión), cuando ese valor se asigna de nuevo en result, es truncada (que la expresión se convierte al int) . Nunca superas 1, por lo que ves 0.

Darle a ella un valor inicial de 0.0 en su lugar.

3

Esto se debe a que proporcionó cero como una constante entera. Las operaciones resultantes están todas en números enteros, por lo que el valor final (0.75) también se trunca en int.

Cambio cero a 0.0 a hacer que funcione:

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

Esto produce 0.75 en ideone.

+0

En realidad, nunca pasa de 0,25 antes de volver a cero. Acuñé una palabra. –

Cuestiones relacionadas