命名空間
變體
動作

MATH_ERRNO, MATH_ERREXCEPT, math_errhandling

出自 cppreference.com
< c‎ | numeric‎ | math
 
 
 
常用數學函式
函式
基本運算
(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)
縮小轉換運算 (Narrowing operations)
(C23)
(C23)
(C23)
(C23)
(C23)
(C23)
量子與量子指數
十進位重編碼函式
全序與有效負載函式
分類
(C99)
(C99)
(C99)
(C23)
誤差與 Gamma 函式
(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  /*實作定義*/
(自 C99 起)

巨集常數 math_errhandling 展開為一個型別為 int 的運算式,其值等於 MATH_ERRNOMATH_ERREXCEPT,或是兩者的位元互斥或(MATH_ERRNO | MATH_ERREXCEPT)。

math_errhandling 的值指示浮點運算子與函數所執行的錯誤處理型別。

常數 說明
MATH_ERREXCEPT 指示使用浮點例外:至少 FE_DIVBYZEROFE_INVALIDFE_OVERFLOW 被定義在 <fenv.h> 中。
MATH_ERRNO 指示浮點運算使用變數 errno 來報告錯誤。

若實作支援 IEEE 浮點運算(IEC 60559),則 math_errhandling & MATH_ERREXCEPT 必須為非零值。

識別出下列浮點錯誤狀況

條件 說明 errno 浮點例外 範例
定義域錯誤 (Domain error) 引數超出該運算在數學上定義的範圍(各個函數的描述中列出了所需的定義域錯誤) EDOM FE_INVALID acos(2)
極點錯誤 (Pole error) 函數的數學結果為嚴格無限大或未定義 ERANGE FE_DIVBYZERO log(0.0), 1.0/0.0
溢位造成的範圍錯誤 (Range error due to overflow) 數學結果為有限值,但在捨入後變成無限大,或在向下捨入後變成可表示的最大有限值 ERANGE FE_OVERFLOW pow(DBL_MAX,2)
下溢造成的範圍錯誤 (Range error due to underflow) 結果為非零值,但在捨入後變成零,或變成失去精確度的非正規化數 (subnormal) ERANGE 或不變(實作定義) FE_UNDERFLOW 或無(實作定義) DBL_TRUE_MIN/2
不精確結果 (Inexact result) 結果必須捨入才能符合目的型別 不變 FE_INEXACT 或無(未指定) sqrt(2), 1.0/10.0

目錄

[編輯] 備註

數學函式庫函數是否引發 FE_INEXACT 通常是未指定的,但可能在函數的描述中明確規定(例如 rintnearbyint 的差異)。

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
English Deutsch 日本語 中文(简体) 中文(繁體)