名稱空間
變體
操作

MATH_ERRNO, MATH_ERREXCEPT, math_errhandling

來自 cppreference.com
< c‎ | 數值‎ | 數學
 
 
 
常用數學函式
函式
基本操作
(C99)
(C99)
(C99)
(C99)(C99)(C99)(C23)
最大值/最小值操作
(C99)
(C99)
指數函式
(C23)
(C99)
(C99)
(C23)
(C23)

(C99)
(C99)(C23)
(C23)
(C23)
冪函式
(C99)
(C23)
(C23)

(C99)
(C23)
(C23)
三角函式和雙曲函式
(C23)
(C23)
(C23)
(C23)
(C99)
(C99)
(C99)
最近整數浮點數
(C99)(C99)(C99)
(C99)

(C99)(C99)(C99)
(C23)(C23)(C23)(C23)
浮點數操作
(C99)(C99)
(C99)(C23)
(C99)
窄化操作
(C23)
(C23)
(C23)
(C23)
(C23)
(C23)
量子與量子指數
十進位制重新編碼函式
總序和載荷函式
分類
(C99)
(C99)
(C99)
(C23)
誤差函式和伽馬函式
(C99)
(C99)
(C99)
(C99)
型別
宏常量
特殊浮點值
(C99)(C23)
引數和返回值
錯誤處理
MATH_ERRNOMATH_ERRNOEXCEPT
(C99)(C99) 
math_errhandling
(C99)

快速操作指示符
 
定義於標頭檔案 <math.h>
#define MATH_ERRNO        1
(C99 起)
#define MATH_ERREXCEPT    2
(C99 起)
#define math_errhandling  /*implementation defined*/
(C99 起)

宏常量 math_errhandling 展開為一個 int 型別的表示式,它要麼等於 MATH_ERRNO,要麼等於 MATH_ERREXCEPT,要麼等於它們的按位或 (MATH_ERRNO | MATH_ERREXCEPT)。

math_errhandling 的值指示了浮點運算子和函式執行的錯誤處理型別。

常量 解釋
MATH_ERREXCEPT 表示使用浮點異常:在 <fenv.h> 中至少定義了 FE_DIVBYZEROFE_INVALIDFE_OVERFLOW
MATH_ERRNO 表示浮點操作使用變數 errno 報告錯誤。

如果實現支援 IEEE 浮點算術 (IEC 60559),則要求 math_errhandling & MATH_ERREXCEPT 為非零。

識別以下浮點錯誤條件

條件 解釋 errno 浮點異常 示例
域錯誤 引數超出運算元學定義的範圍(每個函式的描述列出了所需的域錯誤) EDOM FE_INVALID acos(2)
極點錯誤 函式的數學結果恰好是無窮大或未定義 ERANGE FE_DIVBYZERO log(0.0), 1.0/0.0
由於溢位導致的範圍錯誤 數學結果是有限的,但在四捨五入後變為無窮大,或者在向下舍入後變為可表示的最大有限值 ERANGE FE_OVERFLOW pow(DBL_MAX,2)
由於下溢導致的範圍錯誤 結果非零,但在四捨五入後變為零,或變為次正常數並伴隨精度損失 ERANGE 或不變(實現定義) FE_UNDERFLOW 或無(實現定義) DBL_TRUE_MIN/2
不精確結果 結果必須經過四捨五入才能適應目標型別 不變 FE_INEXACT 或無(未指定) sqrt(2), 1.0/10.0

目錄

[編輯] 注意

數學庫函式是否引發 FE_INEXACT 通常未指定,但可能在函式的描述中明確指定(例如 rint 對比 nearbyint)。

在 C99 之前,未指定浮點異常,任何域錯誤都要求 EDOM,溢位要求 ERANGE,下溢則由實現定義。

[編輯] 示例

#include <stdio.h>
#include <fenv.h>
#include <math.h>
#include <errno.h>
#pragma STDC FENV_ACCESS ON
int main(void)
{
    printf("MATH_ERRNO is %s\n", math_errhandling & MATH_ERRNO ? "set" : "not set");
    printf("MATH_ERREXCEPT is %s\n",
           math_errhandling & MATH_ERREXCEPT ? "set" : "not set");
    feclearexcept(FE_ALL_EXCEPT);
    errno = 0;
    printf("log(0) = %f\n", log(0));
    if(errno == ERANGE)
        perror("errno == ERANGE");
    if(fetestexcept(FE_DIVBYZERO))
        puts("FE_DIVBYZERO (pole error) reported");
}

可能的輸出

MATH_ERRNO is set
MATH_ERREXCEPT is set
log(0) = -inf
errno = ERANGE: Numerical result out of range
FE_DIVBYZERO (pole error) reported

[編輯] 參考

  • C17 標準 (ISO/IEC 9899:2018)
  • 7.12/9 MATH_ERRNO, MATH_ERREXCEPT, math_errhandling (p: 170)
  • F.10/4 MATH_ERREXCEPT, math_errhandling (p: 377)
  • C11 標準 (ISO/IEC 9899:2011)
  • 7.12/9 MATH_ERRNO, MATH_ERREXCEPT, math_errhandling (p: 233)
  • F.10/4 MATH_ERREXCEPT, math_errhandling (p: 517)
  • C99 標準 (ISO/IEC 9899:1999)
  • 7.12/9 MATH_ERRNO, MATH_ERREXCEPT, math_errhandling (p: 214)
  • F.9/4 MATH_ERREXCEPT, math_errhandling> (p: 454)

[編輯] 另請參閱

浮點異常
(宏常量) [編輯]
擴充套件為 POSIX 相容的執行緒區域性錯誤碼變數的宏
(宏變數) [編輯]
C++ 文件 關於 math_errhandling