He estado jugando con C++ 11 últimamente, y se acercó con la siguiente función de suma:¿El compilador no advierte sobre la pérdida de precisión?
template <typename T>
inline T sum(const std::function<T (int)> &f, int initial, int end)
{
T retval = 0;
for(int k = initial; k <= end; k++) {
retval += f(k);
}
return retval;
}
La idea es que puedo pasar una función lambda y por lo tanto tienen una función ordenada y legible para matemática sumas. Luego trató lo siguiente:
int main()
{
std::array<double, 2> arr1 = {{ 0.5, 1.5 }},
arr2 = {{ 1.5, -0.5 }};
auto n = sum<int>([&](int k) { return arr1[k]*arr2[k]; }, // Precision loss!
0, 1);
return 0;
}
he recopilado esta usando g ++ 4.6.3: g++ -Wall -pedantic -std=c++0x -o test main.cpp
y no da ninguna advertencia sobre la pérdida de precisión comenté en el comentario del código fuente.
Es casi un hecho aquí que sum<int>
es algo malo de hacer, pero puede no ser tan obvio en contextos más complejos. ¿Debería el compilador no darse cuenta de que el valor de retorno de mi función lambda es double
y advertirme que estoy perdiendo precisión al convertir a int
? ¿Hay alguna razón específica por la que no?
La función no tendrá en cuenta la precisión porque el tiempo de ejecución realiza una conversión implícita antes de pasar los argumentos. Sin embargo, en un mundo ideal, al menos debería ver una advertencia en el estudio visual/su IDE para reflejar que esto daría lugar a una pérdida de precisión. pero, ¿de qué tratan las pruebas unitarias? – War
@Wardy en un mundo ideal que no se compilaría (es decir, sería un error, no una advertencia) sin una solicitud explícita de causar esta pérdida de precisión. –
ok ... bueno soy un desarrollador de C# y tengo que seguir las reglas de .net (no estoy seguro de si también está usando un compilador .net) pero dice en la documentación que donde se espera un tipo menos preciso y un implícito el reparto se aplica ... se considera una característica del lenguaje. Aunque estoy de acuerdo ... un error sería el sueño absoluto en tu escenario pero no es común para la plataforma en mi experiencia. – War