math_errhandling宏
概要:
#define math_errhandling value //value值由实现定义。
描述:
该宏会扩展为int类型的常量表达式,其值为MATH_ERRNO、MATH_ERREXCEPT或者(MATH_ERRNO | MATH_ERREXCEPT),表示通过errno和引发浮点异常报告错误的宏。
ISO/IEC 9899:2018标准未明确说明math_errhandling是宏,还是具有外部链接的标识符。
如果宏math_errhandling定义是禁止的,或者程序定义了名为math_errhandling的标识符,其行为是未定义的。
如果表达式(math_errhandling & MATH_ERREXCEPT)为非0值,实现应在<fenv.h>头文件中定义宏FE_DIVBYZERO、FE_INVALID、FE_OVERFLOW。
ISO/IEC 9899:2018标准第7.12.1 Treatment of error conditions节规定了数学函数错误情况的处理,归纳如下表所示:
宏 | 错误 | 处理 |
MATH_ERRNO | 域错误(domain error):当且仅当输入参数不在数学函数定义的域内时,才会发生域错误,例如:sqrt(-5.0)。 |
errno设置为EDOM。①⑤ |
极点错误(pole error):也称奇点或者无穷大,当且仅当有限参数接近极限时,数学函数将具有无限结果,从而发生极点错误,例如:log(0.0)。 |
errno设置为ERANGE。①⑤ | |
溢出(overflow):如果数学函数的结果是有限的,但太大,指定类型如果没有异常舍入就无法表示该结果,这时会发生溢出,例如:exp(1000.0)。 |
errno设置为ERANGE。①⑤ | |
下溢(underflow):如果数学函数的结果是有限的,但太小,指定类型如果没有异常舍入就无法表示该结果,这时会发生下溢,例如:exp(-1000.0)。 |
errno设置为ERANGE。③⑤ | |
MATH_ERREXCEPT | 域错误(domain error):当且仅当输入参数不在数学函数定义的域内时,才会发生域错误,例如:sqrt(-5.0)。 |
引发浮点异常FE_INVALID。② |
极点错误(pole error):也称奇点或者无穷大,当且仅当有限参数接近极限时,数学函数将具有无限结果,从而发生极点错误,例如:log(0.0)。 |
引发浮点异常FE_DIVBYZERO。② | |
溢出(overflow):如果数学函数的结果是有限的,但太大,指定类型如果没有异常舍入就无法表示该结果,这时会发生溢出,例如:exp(1000.0)。 |
引发浮点异常FE_OVERFLOW。② | |
下溢(underflow):如果数学函数的结果是有限的,但太小,指定类型如果没有异常舍入就无法表示该结果,这时会发生下溢,例如:exp(-1000.0)。 |
引发浮点异常FE_UNDERFLOW。④ |
①如果表达式(math_errhandling & MATH_ERRNO)是非0值,errno将被设置为与错误对应的值。
②如果表达式(math_errhandling & MATH_ERREXCEPT)是非0值,将引发对应的浮点异常。
③如果表达式(math_errhandling & MATH_ERRNO)是非0值,errno是否设置为ERANGE将由实现定义。
④如果表达式(math_errhandling & MATH_ERREXCEPT)是非0值,是否引发浮点异常FE_UNDERFLOW将由实现定义。
⑤如果发生域错误、极点错误、溢出或者下溢,并且表达式(math_errhandling & MATH_ERRNO)值等于0,errno应设置为与错误对应的值或者保持不变。
如果没有发生上述错误,无论math_errhandling如何设置,errno都应保持不变。
范例:
|
|
输出:
Error: ERANGE
Exceptions: FE_DIVBYZERO
注:使用Visual Studio编译。
相关内容:
MATH_ERRNO | 表示通过errno报告错误的宏。 |
MATH_ERREXCEPT | 表示通过引发浮点异常报告错误的宏。 |