Search code examples
c++performancenanbranchless

How to portably force NAN * zero give zero in a particular expression without branching?


In general, (quiet) NAN times zero should give NAN -- and it does.

However, in one particular performance-critical part of my code, I want zero times anything to be zero.

What's a fast way to do this in C++?


Solution

  • double mymult(double a, double b){
      double result[]={a*b,0.};
      return result[(a==0.)|(b==0.)];
    }
    

    should avoid branches: double check the generated assembly.

    Not all bool calculations imply a branch.