C 库 - fetestexcept() 函数
C fenv 库中的 fetestexcept() 函数用于检查当前通过"excepts"参数设置了哪些指定的浮点异常。
excepts 参数是异常宏的按位或组合,例如 FE_DIVBYZERO、FE_INEXACT、FE_INVALID、FE_OVERFLOW、FE_UNDERFLOW 和 FE_ALL_EXCEPT。
语法
以下是 fetestexcept() 函数的 C 库语法 -
int fetestexcept( int excepts );
参数
此函数接受单个参数 -
-
excepts - 它表示要测试的异常标志的位掩码列表。
返回值
此函数返回一个整数值,该值是 excepts 参数指定的当前设置的异常标志对应的浮点异常宏的按位或值。
示例 1
以下是演示 fetestexcept() 函数用法的基本 C 程序。
#include <stdio.h> #include <fenv.h> int main() { // 首先清除所有异常 feclearexcept(FE_ALL_EXCEPT); // 除以零异常 double result = 1.0 / 0.0; // 测试设置了哪些异常标志 int flags = fetestexcept(FE_DIVBYZERO); if (flags & FE_DIVBYZERO) { printf("Divide by zero exception is set."); } else{ printf("No exception is set. "); } return 0; }
输出
以下是输出 -
Divide by zero exception is set.
示例 2
以下程序使用 fetestexcept() 函数检查我们遇到的浮点异常类型。
#include <stdio.h> #include <fenv.h> #include <math.h> int main() { // 首先清除所有异常 feclearexcept(FE_ALL_EXCEPT); double result = sqrt(-1.0); // 测试设置了哪些异常标志 int flags = fetestexcept(FE_ALL_EXCEPT); if (flags & FE_DIVBYZERO) { printf("Divide by zero exception is set."); } if (flags & FE_INEXACT) { printf("Inexact result exception is set."); } if (flags & FE_INVALID) { printf("Invalid operation exception is set."); } if (flags & FE_OVERFLOW) { printf("Overflow exception is set."); } if (flags & FE_UNDERFLOW) { printf("Underflow exception is set."); } return 0; }
输出
以下是输出 -
Invalid operation exception is set.
示例 3
以下示例检查大值相乘后是否发生溢出异常。
#include <stdio.h> #include <fenv.h> #include <math.h> int main() { // 首先清除所有异常标志 feclearexcept(FE_ALL_EXCEPT); // 通过乘以较大的值来产生溢出异常 double overflow_result = 1.0e300 * 1.0e300; // 测试哪些异常标志 int flags = fetestexcept(FE_OVERFLOW); if (flags & FE_OVERFLOW) { printf("Overflow exception is set."); } else { printf("No exception is set."); } return 0; }
输出
以下是输出 -
Overflow exception is set.