suma - programa que sume reste multiplique y divida en c++
¿El compilador optimizará la división en multiplicación? (1)
Dependiendo de esta pregunta División de punto flotante vs multiplicación de punto flotante . La división es más lenta que la multiplicación debido a algunas razones.
¿Reemplazará el compilador, por lo general, la división por la multiplicación si es posible?
Por ejemplo:
float a;
// During runtime a=5.4f
float b = a/10.f;
Lo será:
float a;
// During runtime a=5.4f
float b = a*0.1f;
Si se considera una pregunta confiable del compilador, estoy usando el compilador predeterminado VS2013. Sin embargo, sería bueno si obtuviera una respuesta genérica (validez teórica de esta optimización)
No, al compilador no se le permite hacer eso en el caso general: las dos operaciones podrían producir resultados que no son idénticos a los bits debido al error de representación del recíproco.
En tu ejemplo, 0.1
no tiene una representación exacta como float
. Esto hace que los resultados de la multiplicación por 0.1
y la división por 10
difieran:
float f = 21736517;
float a = f / 10.f;
float b = f * 0.1f;
cout << (a == b) << endl; // Prints zero
Nota: como njuffa anota correctamente en el comentario a continuación, hay situaciones en las que el compilador podría realizar algunas optimizaciones para un amplio conjunto de números, como se describe en este documento . Por ejemplo, multiplicar o dividir por una potencia de dos es equivalente a la adición a la porción de exponente de la representación float
IEEE-754.