Avatar ·

Por qué reemplazar 0.1f por 0 ralentiza el código 10 veces en Visual Studio 2010?

¡Hola a todos! Escribo en C++ en Visual Studio 2010. Escribí un bucle simple para cálculos de punto flotante, pero noté un comportamiento extraño. Si en la condición del bucle está el número 0.1f, el código funciona rápido. Si lo reemplazo por 0 (o cualquier otro número entero, por ejemplo 1), el rendimiento cae aproximadamente 10 veces. Aquí hay un ejemplo: ```cpp const float x = 1.0f; for (int i = 0; i < 100000000; ++i) { // Variante rápida: if (x < 0.1f) // Variante lenta: if (x < 0) } ``` Compilo en Release con optimizaciones /O2. ¿Por qué tal diferencia? ¿El compilador hace algo mal? ¿O es una característica de SSE/FPU? Agradecería una explicación, porque estoy en un callejón sin salida. ¡Gracias de antemano! <<>>

Raíz del problema: números desnormalizados y penalización por su procesamiento

La diferencia en rendimiento está relacionada con cómo el procesador maneja los números desnormalizados (subnormales). Cuando comparas float x = 1.0f con 0, el resultado es false, y