<cmath> <ctgmath>

math_errhandling

int
错误处理
展开为一个表达式,用于标识 <cmath> 头文件中函数的错误处理机制

常量描述
MATH_ERRNO1使用 errno 来指示错误
- 发生“定义域错误”时:“errno”被设置为 EDOM
- 发生“范围错误”(包括“极点错误”、“溢出”和可能的“下溢”)时:“errno”被设置为 ERANGE
MATH_ERREXCEPT2引发相应的 C 异常
- 发生“定义域错误”时:引发 FE_INVALID
- 发生“极点错误”时:引发 FE_DIVBYZERO
- 发生“溢出”时:引发 FE_OVERFLOW
- 发生“下溢”时:可能引发 FE_UNDERFLOW
MATH_ERRNO|MATH_ERREXCEPT3以上两者兼有

MATH_ERRNOMATH_ERREXCEPT 都是宏常量表达式,分别在 <cmath> 中定义为 12

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
/* math_errhandling example */
#include <stdio.h>      /* printf */
#include <math.h>       /* math_errhandling */
#include <errno.h>      /* errno, EDOM */
#include <fenv.h>       /* feclearexcept, fetestexcept, FE_ALL_EXCEPT, FE_INVALID */
#pragma STDC FENV_ACCESS on

int main () {
  errno = 0;
  if (math_errhandling & MATH_ERREXCEPT) feclearexcept(FE_ALL_EXCEPT);

  printf ("Error handling: %d",math_errhandling);

  sqrt (-1);
  if (math_errhandling & MATH_ERRNO) {
    if (errno==EDOM) printf("errno set to EDOM\n");
  }
  if (math_errhandling  &MATH_ERREXCEPT) {
    if (fetestexcept(FE_INVALID)) printf("FE_INVALID raised\n");
  }

  return 0;
}

可能的输出

Error handling: 3
errno set to EDOM
FE_INVALID raised


数据竞争

支持多线程的库应在每个线程的基础上实现 errno 和/或浮点“异常状态”:每个线程都有自己的局部 errno 和浮点状态。
这是符合 C11 和 C++11 标准的库的要求。