# FP_NORMAL, FP_SUBNORMAL, FP_ZERO, FP_INFINITE, FP_NAN

< c‎ | numeric‎ | math

定义于头文件 `<math.h>` |  |
#define FP_NORMAL /*implementation defined*/ |  | (C99 起)
#define FP_SUBNORMAL /*implementation defined*/ |  | (C99 起)
#define FP_ZERO /*implementation defined*/ |  | (C99 起)
#define FP_INFINITE /*implementation defined*/ |  | (C99 起)
#define FP_NAN /*implementation defined*/ |  | (C99 起)

`FP_NORMAL` 、 `FP_SUBNORMAL` 、 `FP_ZERO` 、 `FP_INFINITE` 、 `FP_NAN` 宏各代表一个独自的浮点数类别。它们都展开成整数常量表达式。

常量 | 解释
`FP_NORMAL` | 指示值为正规，即不是无穷大、非正规、非数或零
`FP_SUBNORMAL` | 指示值为非正规
`FP_ZERO` | 指示值为正或负零
`FP_INFINITE` | 指示值无法以底层类型表示（正或负无穷大）
`FP_NAN` | 指示值是非数（ NaN ）

### 示例

    #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/6 FP_NORMAL, ... (p: 232)

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

  - 7.12/6 FP_NORMAL, ... (p: 213)

### 参阅

fpclassify (C99) | 对给定的浮点值分类 (宏函数)