?
This document uses PHP Chinese website manual Release
在頭文件<math.h>中定義 | ||
---|---|---|
#define MATH_ERRNO 1 | (since C99) | |
#define MATH_ERREXCEPT 2 | (since C99) | |
#define math_errhandling /*implementation defined*/ | (since C99) |
宏常量math_errhandling
擴(kuò)展為int
等于MATH_ERRNO
或等于MATH_ERREXCEPT
或等于它們的OR(MATH_ERRNO | MATH_ERREXCEPT
)的類型的表達(dá)式。
值math_errhandling
指示由浮點(diǎn)運(yùn)算符和函數(shù)執(zhí)行的錯(cuò)誤處理類型:
不變 | 說明 |
---|---|
MATH_ERREXCEPT | 表示使用了浮點(diǎn)異常:至少FE_DIVBYZERO,F(xiàn)E_INVALID和FE_OVERFLOW在<fenv.h>中定義。 |
MATH_ERRNO | 表示浮點(diǎn)操作使用變量errno來報(bào)告錯(cuò)誤。 |
如果實(shí)現(xiàn)支持IEEE浮點(diǎn)運(yùn)算(IEC 60559),math_errhandling & MATH_ERREXCEPT
則要求為非零。
以下浮點(diǎn)錯(cuò)誤條件被識(shí)別:
條件 | 說明 | 錯(cuò)誤號(hào) | 浮點(diǎn)異常 | 例 |
---|---|---|---|---|
域錯(cuò)誤 | 參數(shù)超出了操作數(shù)學(xué)定義的范圍(每個(gè)函數(shù)的描述都列出了所需的域錯(cuò)誤) | 益登 | FE_INVALID | ACOS(2) |
極點(diǎn)錯(cuò)誤 | 該函數(shù)的數(shù)學(xué)結(jié)果恰好是無限的或未定義的 | 呻吟 | FE_DIVBYZERO | 日志(0.0),1.0 / 0.0 |
由于溢出導(dǎo)致范圍錯(cuò)誤 | 數(shù)學(xué)結(jié)果是有限的,但在舍入后變?yōu)闊o限,或者在舍入后成為最大的可表示的有限值 | 呻吟 | FE_OVERFLOW | POW(DBL_MAX,2) |
由于下溢導(dǎo)致的范圍錯(cuò)誤 | 結(jié)果非零,但在舍入后變?yōu)榱?,或者由于精度損失而變?yōu)榈陀谡V?/p> | ERANGE或未更改(實(shí)施定義) | FE_UNDERFLOW或者什么都沒有(實(shí)現(xiàn)定義) | DBL_MIN / 2 |
不精確的結(jié)果 | 結(jié)果必須進(jìn)行四舍五入以適合目標(biāo)類型 | 不變 | FE_INEXACT或沒有(未指定) | sqrt(2),1.0 / 10.0 |
是否FE_INEXACT
由數(shù)學(xué)函數(shù)庫提出函數(shù)通常沒有具體說明,但可以在函數(shù)的描述中明確指定(例如rint
vs nearbyint
)。
在C99之前,未指定浮點(diǎn)異常,EDOM
是任何域錯(cuò)誤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 setMATH_ERREXCEPT is setlog(0) = -inf errno = ERANGE: Numerical result out of rangeFE_DIVBYZERO (pole error) reported
C11標(biāo)準(zhǔn)(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標(biāo)準(zhǔn)(ISO / IEC 9899:1999):
7.12 / 9 MATH_ERRNO,MATH_ERREXCEPT,math_errhandling(p:214)
F.9 / 4 MATH_ERREXCEPT,math_errhandling>(p:454)