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类型的常量表达式,其值是2的N次方,不同宏对应不同的N值。
具体实现中,还可能定义一些以FE_和一个大写字母开头的表示浮点异常的宏,这些宏同样会扩展为int类型的常量表达式。
所有表示浮点异常的宏(FE_ALL_EXCEPT除外)按位或运算结果为FE_ALL_EXCEPT,按位与运算结果为0。
范例:
|
|
输出:
FE_INVALID:1
FE_UNDERFLOW:16
FE_ALL_EXCEPT:63
fetestexcept(FE_ALL_EXCEPT):17
在这个例子中先引发了两个异常FE_INVALID、FE_UNDERFLOW,然后分别输出FE_ALL_EXCEPT和fetestexcept(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值为63;fetestexcept(FE_ALL_EXCEPT)返回的是已设置的浮点异常宏的按位或运算结果,即(FE_INVALID | FE_UNDERFLOW)的运算结果,所以值为17。
相关内容:
FE_DIVBYZERO | 表示极点异常的宏。 |
FE_INEXACT | 表示不准确结果异常的宏。 |
FE_INVALID | 表示域异常的宏。 |
FE_OVERFLOW | 表示溢出范围异常的宏。 |
FE_UNDERFLOW | 表示下溢范围异常的宏。 |