Por que substituir 0.1f por 0 deixa o código 10 vezes mais lento no Visual Studio 2010?
Olá a todos! Escrevo em C++ no Visual Studio 2010. Escrevi um loop simples para cálculos com ponto flutuante, mas notei um comportamento estranho. Se na condição do loop uso o número 0.1f, o código roda rápido. Se substituo por 0 (ou qualquer outro número inteiro, como 1), a performance cai cerca de 10 vezes. Aqui está um exemplo:
```cpp
const float x = 1.0f;
for (int i = 0; i < 100000000; ++i) {
// Versão rápida: if (x < 0.1f)
// Versão lenta: if (x < 0)
}
```
Estou compilando em Release com otimizações /O2. Por que essa diferença? O compilador está fazendo algo errado? Ou é uma característica do SSE/FPU? Agradeço uma explicação, pois estou confuso. Desde já, obrigado!
<<>>
Raiz do problema: números denormalizados e penalidade por processá-los
A diferença de performance está relacionada a como o processador lida com números denormalizados (subnormais). Quando você compara float x = 1.0f com 0, o resultado é false, e