<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 標準的庫的要求。