当前位置: C语言 -- 标准库 -- <fenv.h> -- fetestexceptflag

fetestexceptflag函数


概要:
#include <fenv.h>
int fetestexceptflag(const fexcept_t *flagp, int excepts);

描述:

该函数用于确定在参数flagp指向的对象中,哪些指定的浮点异常标志子集被设置。*flagp值应先通过fegetexceptflag函数调用获取,fegetexceptflag函数的第二个参数至少表示参数excepts表示的浮点异常。参数excepts指定要查询的浮点状态标志。

函数fetestexcept、feraiseexcept、fesetexcept、feclearexcept支持设置或者清除浮点状态标志的基本抽象。具体实现中,浮点状态标志可能包含更多信息,例如:首次引发浮点异常的代码地址;函数fegetexceptflag、fesetexceptflag、fetestexceptflag能够处理浮点状态标志的全部内容。


参数:
const fexcept_t *flagp

参数为指向const fexcept_t类型对象的指针。

int excepts

参数为位掩码值,表示浮点异常的子集,可以是0,也可以是一个或者多个实现支持的浮点异常宏的按位或运算值(例如:FE_OVERFLOW|FE_INEXACT)。如果参数是其它值,函数行为是未定义的。


返回值:

函数返回参数excepts中包含的、*flagp中设置的浮点异常对应的浮点异常宏的按位或运算值。


范例:
1 
2 
3 
4 
5 
6 
7 
8 
9 
10 
11 
12 
13 
14 
15 
16 
17 
18 
19 
20 
21 
22 
23 
24 
25 
26 
27 
28 
29 
30 
31 
32 
33 
34 
35 
36 
/*函数fetestexceptflag范例*/

#include <fenv.h>
#include <math.h>
#include <stdio.h>

#pragma STDC FENV_ACCESS ON

int main(void)
{
    fexcept_t flagp;
    int setExceptions;

    feclearexcept(FE_ALL_EXCEPT);
    double result = exp(1000.0);

    fegetexceptflag(&flagp,FE_ALL_EXCEPT);
    setExceptions = fetestexceptflag(&flagp, FE_ALL_EXCEPT);

    puts("The following exceptions are set:");
    if(setExceptions==0)
        puts("No floating-point status flag is set.");
    if(setExceptions&FE_DIVBYZERO)
        puts("FE_DIVBYZERO");
    if(setExceptions&FE_INEXACT)
        puts("FE_INEXACT");
    if(setExceptions&FE_INVALID)
        puts("FE_INVALID");
    if(setExceptions&FE_OVERFLOW)
        puts("FE_OVERFLOW");
    if(setExceptions&FE_UNDERFLOW)
        puts("FE_UNDERFLOW");

    return 0;
}


可能输出:

The following exceptions are set:

FE_INEXACT

FE_OVERFLOW

(注:编译时实现还未支持fetestexceptflag函数。)


相关内容:
feclearexcept 清除浮点异常(基本抽象)的函数。
fegetexceptflag 获取浮点状态标志状态(完整内容)的函数。
feraiseexcept 引发浮点异常(基本抽象)的函数。
fesetexceptflag 设置浮点状态标志(完整内容)的函数。
fesetexcept 设置浮点异常标志(基本抽象)的函数。
fetestexcept 测试浮点异常标志(基本抽象)的函数。


主要参考资料:

1、ISO/IEC 9899:2024

2、ISO/IEC 9899:2018