命名空间
变体
操作

MATH_ERRNO, MATH_ERREXCEPT, math_errhandling

来自 cppreference.cn
< c‎ | 数值‎ | 数学
 
 
 
常用数学函数
函数
基本操作
(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  /*implementation defined*/
(C99 起)

宏常量 math_errhandling 展开为一个 int 类型的表达式,它要么等于 MATH_ERRNO,要么等于 MATH_ERREXCEPT,要么等于它们的按位或 (MATH_ERRNO | MATH_ERREXCEPT)。

math_errhandling 的值指示了浮点运算符和函数执行的错误处理类型。

常量 解释
MATH_ERREXCEPT 表示使用浮点异常:在 <fenv.h> 中至少定义了 FE_DIVBYZEROFE_INVALIDFE_OVERFLOW
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 通常未指定,但可能在函数的描述中明确指定(例如 rint 对比 nearbyint)。

在 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