命名空间
变体
操作

MATH_ERRNO、MATH_ERREXCEPT、math_errhandling

来自 cppreference.com
< c‎ | numeric‎ | math
 
 
 
常用数学函数
类型
(C99)(C99)    

(C99)(C99)    

函数
基本运算
(C99)
(C99)
(C99)
(C99)(C99)(C99)(C23)
最大/最小运算
(C99)
(C23)    
指数函数
(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)
(C99)
(C99)(C99)(C99)
(C23)(C23)(C23)(C23)
浮点操作函数
(C99)(C99)
(C99)(C23)
(C99)
缩窄操作
(C23)
(C23)
(C23)
(C23)
(C23)
(C23)
量子和量子指数函数
十进制重新编码函数
全序和有效载荷函数
分类
(C99)
(C99)
(C99)
(C23)
宏常量
特殊浮点值
(C99)(C23)
参数和返回值
(C99)(C99)(C99)(C99)(C99)    
错误处理
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_ERRNO,或等于 MATH_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 浮点异常 示例
域错误 参数超出操作在数学上定义的范围(每个函数 的描述列出了必需的域错误) 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 在一般情况下是未指定的,但可以在函数的描述中明确指定(例如 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++ 文档 for math_errhandling