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

fesetexcept函数


概要:
#include <fenv.h>
int fesetexcept(int excepts);

描述:

该函数尝试设置参数excepts表示的实现支持的浮点异常标志。

该函数不会清除任何浮点异常标志;会改变浮点异常标志的状态,但不会引起与引发浮点异常可能相关的任何其它副作用(类似浮点异常陷阱和ISO/IEC 60559标准异常处理这样的实现扩展将不会发生。)。


fesetexcept函数和feraiseexcept函数的比较:

fesetexcept函数仅设置浮点异常标志,不会产生任何副作用,没有其它影响。

feraiseexcept函数会设置浮点异常标志,同时会触发一个完整的异常处理流程,可能产生标准或者实现定义的副作用,例如:可能会触发相应信号,也可能会执行设置的陷阱处理程序等。


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


参数:
int excepts

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


返回值:

如果参数excepts为0或者如果所有指定异常都成功设置,函数返回0;否则函数返回非0值。


范例:
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 
37 
38 
39 
40 
41 
/*函数fesetexcept范例*/

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

#pragma STDC FENV_ACCESS ON

void showExceptions(void)
{
    printf("Exceptions: ");
    /*判断是否设置浮点异常。*/
    if(fetestexcept(FE_ALL_EXCEPT)==0)
    {
        puts("No floating-point status flag is set.");
    }
    else
    {
    	/*判断设置的浮点异常。*/
        if(fetestexcept(FE_DIVBYZERO))
            printf("FE_DIVBYZERO ");
        if(fetestexcept(FE_INEXACT))
            printf("FE_INEXACT ");
        if(fetestexcept(FE_INVALID))
            printf("FE_INVALID ");
        if(fetestexcept(FE_OVERFLOW))
            printf("FE_OVERFLOW ");
        if(fetestexcept(FE_UNDERFLOW))
            printf("FE_UNDERFLOW ");
        puts("");
    }
}

int main(void)
{
    feclearexcept(FE_ALL_EXCEPT);
    fesetexcept(FE_INVALID);
    showExceptions();

    return 0;
}


可能输出:

Exceptions: FE_INVALID

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


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


主要参考资料:

1、ISO/IEC 9899:2024

2、ISO/IEC 9899:2018