Search code examples
cfloating-pointc17

Is fpclassify(x) == FP_NAN functionally equivalent to isnan(x)?


Is fpclassify(x) == FP_NAN functionally equivalent to isnan(x)?

The same question goes for:

  • fpclassify(x) == FP_INFINITE vs. isinf(x)
  • fpclassify(x) == FP_NORMAL vs. isnormal(x)
  • fpclassify(x) == FP_SUBNORMAL vs. issubnormal(x)
  • fpclassify(x) == FP_ZERO vs. iszero(x)

If they are functionally equivalent, then why need of duplicates?


Solution

  • They're functionally equivalent. But fpclassify allows you to perform a single test and use a switch statement, which may be slightly faster and/or produce simpler code than the chained if/else if/else blocks would use to perform type by type checks (assuming fpclassify itself has efficient ways to differentiate itself; won't swear to that), e.g. per the cppreference example:

    const char *show_classification(double x) {
        switch(fpclassify(x)) {
            case FP_INFINITE:  return "Inf";
            case FP_NAN:       return "NaN";
            case FP_NORMAL:    return "normal";
            case FP_SUBNORMAL: return "subnormal";
            case FP_ZERO:      return "zero";
            default:           return "unknown";
        }
    }