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

FE_ALL_EXCEPT宏


概要:

#define FE_ALL_EXCEPT value //其值是实现定义的该宏除外的浮点异常宏按位或运算结果。


描述:

该宏表示所有异常,其值是实现定义的所有浮点异常宏(FE_ALL_EXCEPT除外)的按位或运算结果;如果实现没有定义异常宏,FE_ALL_EXCEPT值为0

ISO/IEC 9899:2018标准除宏FE_ALL_EXCEPT外,还定义了多个表示浮点异常的宏,具体如下:

浮点异常宏 描述
FE_DIVBYZERO 极点异常:结果接近无限值,但参数是有限值,例如:除以0
FE_INEXACT 不准确结果异常:为了保存浮点运算结果,必须进行舍入。
FE_INVALID 域异常:参数不在函数要求的范围内。
FE_OVERFLOW 溢出范围异常:结果绝对值太大,函数返回值的数据类型无法表示该结果。
FE_UNDERFLOW 下溢范围异常:结果绝对值太小,函数返回值的数据类型无法表示该结果。

上表中宏会扩展为int类型的常量表达式,其值是2N次方,不同宏对应不同的N值。

具体实现中,还可能定义一些以FE_和一个大写字母开头的表示浮点异常的宏,这些宏同样会扩展为int类型的常量表达式。

所有表示浮点异常的宏(FE_ALL_EXCEPT除外)按位或运算结果为FE_ALL_EXCEPT,按位与运算结果为0


范例:
1 
2 
3 
4 
5 
6 
7 
8 
9 
10 
11 
12 
13 
14 
15 
16 
17 
18 
19 
20 
21 
/*宏FE_ALL_EXCEPT范例*/

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

#pragma STDC FENV_ACCESS ON

int main(void)
{
    feclearexcept(FE_ALL_EXCEPT);
    feraiseexcept(FE_INVALID);
    feraiseexcept(FE_UNDERFLOW);

    printf("FE_INVALID:%d\n", FE_INVALID);
    printf("FE_UNDERFLOW:%d\n", FE_UNDERFLOW);
    printf("FE_ALL_EXCEPT:%d\n",FE_ALL_EXCEPT);
    printf("fetestexcept(FE_ALL_EXCEPT):%d\n", fetestexcept(FE_ALL_EXCEPT));

    return 0;
}


输出:

FE_INVALID:1

FE_UNDERFLOW:16

FE_ALL_EXCEPT:63

fetestexcept(FE_ALL_EXCEPT):17

在这个例子中先引发了两个异常FE_INVALIDFE_UNDERFLOW,然后分别输出FE_ALL_EXCEPTfetestexcept(FE_ALL_EXCEPT)的返回值。


本次测试所用GCC编译器的<fenv.h>头文件中定义了7个与浮点异常有关的宏,分别是:

#define FE_INVALID 0x01
#define FE_DENORMAL 0x02
#define FE_DIVBYZERO 0x04
#define FE_OVERFLOW 0x08
#define FE_UNDERFLOW 0x10
#define FE_INEXACT 0x20
#define FE_ALL_EXCEPT (FE_INVALID | FE_DENORMAL | FE_DIVBYZERO \
| FE_OVERFLOW | FE_UNDERFLOW | FE_INEXACT)

所以FE_ALL_EXCEPT值为63fetestexcept(FE_ALL_EXCEPT)返回的是已设置的浮点异常宏的按位或运算结果,即(FE_INVALID | FE_UNDERFLOW)的运算结果,所以值为17


相关内容:
FE_DIVBYZERO 表示极点异常的宏。
FE_INEXACT 表示不准确结果异常的宏。
FE_INVALID 表示域异常的宏。
FE_OVERFLOW 表示溢出范围异常的宏。
FE_UNDERFLOW 表示下溢范围异常的宏。