Search code examples
c++floating-pointperformance

Avoiding denormal values in C++


After searching a long time for a performance bug, I read about denormal floating point values.

Apparently denormalized floating-point values can be a major performance concern as is illustrated in this question: Why does changing 0.1f to 0 slow down performance by 10x?

I have an Intel Core 2 Duo and I am compiling with gcc, using -O2.

So what do I do? Can I somehow instruct g++ to avoid denormal values? If not, can I somehow test if a float is denormal?


Solution

  • You can test whether a float is denormal using

    #include <cmath>
    
    if ( std::fpclassify( flt ) == FP_SUBNORMAL )
    

    (Caveat: I'm not sure that this will execute at full speed in practice.)

    In C++03, and this code has worked for me in practice,

    #include <cmath>
    #include <limits>
    
    if ( flt != 0 && std::fabsf( flt ) < std::numeric_limits<float>::min() ) {
        // it's denormalized
    }
    

    To decide where to apply this, you may use a sample-based analyzer like Shark, VTune, or Zoom, to highlight the instructions slowed by denormal values. Micro-optimization, even more than other optimizations, is totally hopeless without analysis both before and after.