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.

