# fpclassify

< c‎ | numeric‎ | math

定义于头文件 `<math.h>` |  |
#define fpclassify(arg) /* implementation defined */ |  | (C99 起)

归类浮点值 `arg` 到下列类别中：零、非正规、正规、无穷大、 NaN 或实现定义类别。该宏返回整数值。

忽略 FLT_EVAL_METHOD ：即使以多于参数类型的范围和精度对它求值，首先仍将它转换到其语义类型，然后分类基于该类型：正规的 `long double` 值可能在转换到 `double` 时变为非正规，而在转换到 `float` 时变为零。

### 参数

arg | - | 浮点值

### 返回值

指明 `arg` 类别的 FP_INFINITE 、 FP_NAN 、 FP_NORMAL 、 FP_SUBNORMAL 、 FP_ZERO 或实现定义类型之一。

### 示例

    #include <stdio.h>
    #include <math.h>
    #include <float.h>

    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";
        }
    }
    int main(void)
    {
        printf("1.0/0.0 is %s\n", show_classification(1/0.0));
        printf("0.0/0.0 is %s\n", show_classification(0.0/0.0));
        printf("DBL_MIN/2 is %s\n", show_classification(DBL_MIN/2));
        printf("-0.0 is %s\n", show_classification(-0.0));
        printf("1.0 is %s\n", show_classification(1.0));
    }

输出：

    1.0/0.0 is Inf
    0.0/0.0 is NaN
    DBL_MIN/2 is subnormal
    -0.0 is zero
    1.0 is normal

### 引用

- C11 标准（ISO/IEC 9899:2011）：

  - 7.12.3.1 The fpclassify macro (p: 235)

- C99 标准（ISO/IEC 9899:1999）：

  - 7.12.3.1 The fpclassify macro (p: 216)

### 参阅

isfinite (C99) | 检查给定数是否具有有限值 (宏函数)
isinf (C99) | 检查给定数是否是无穷大 (宏函数)
isnan (C99) | 检查给定数是否为 NaN (宏函数)
isnormal (C99) | 检查给定数是否正规 (宏函数)