命名空间
变体
操作

MATH_ERRNO, MATH_ERREXCEPT, math_errhandling

来自 cppreference.cn
< 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)
窄化操作
(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  /*实现定义*/
(自 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)
下溢的范围错误 结果非零,但在舍入后变为零,或变为 subnormal 且精度降低 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 (页: 170)
  • F.10/4 MATH_ERREXCEPT, math_errhandling (页: 377)
  • C11 标准 (ISO/IEC 9899:2011)
  • 7.12/9 MATH_ERRNO, MATH_ERREXCEPT, math_errhandling (页: 233)
  • F.10/4 MATH_ERREXCEPT, math_errhandling (页: 517)
  • C99 标准 (ISO/IEC 9899:1999)
  • 7.12/9 MATH_ERRNO, MATH_ERREXCEPT, math_errhandling (页: 214)
  • F.9/4 MATH_ERREXCEPT, math_errhandling> (页: 454)

[编辑] 参见

浮点异常
(宏常量) [编辑]
宏,展开为 POSIX 兼容的线程局部错误编号变量
(宏变量) [编辑]
C++ 文档 关于 math_errhandling