C 库 - feraiseexcept() 函数

❮ C 标准库 - <fenv.h>


C fenv 库中的 feraiseexcept() 函数用于引发"excepts"参数中指定的浮点异常。该参数是浮点异常宏的按位或组合,例如 FE_DIVBYZERO、FE_INEXACT、FE_INVALID、FE_OVERFLOW 和 FE_UNDERFLOW

如果 except 引发异常时包含 FE_OVERFLOW 或 FE_UNDERFLOW,则该函数也可能引发 FE_INEXACT。因为异常的引发顺序未指定,但 FE_OVERFLOW 和 FE_UNDERFLOW 总是在 FE_INEXACT 之前引发。

语法

以下是 feraiseexcept() 函数的 C 库语法 -

int feraiseexcept( int excepts );

参数

此函数接受单个参数 -

  • excepts - 它表示要引发的异常标志的位掩码列表。

返回值

如果引发了所有列出的异常,则此函数返回 0,否则返回非零值。

示例 1

以下是用于演示 feraiseexcept() 函数用法的基本 C 程序。

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

int main() {
   // 启用除零和溢出异常
   if (feraiseexcept(FE_DIVBYZERO | FE_OVERFLOW) != 0) {
      printf("Failed to raise the specified floating-point exceptions.");
      return 1;
   } else {
      printf("Successfully raised the specified floating-point exceptions.");
   }
   return 0;
}

输出

以下是输出 -

Successfully raised the specified floating-point exceptions.

示例 2

以下 C 程序使用 feraiseexcept() 函数引发"FE_INEXACT"浮点异常。

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

int main() {
	// 引发 FE_INEXACT 浮点异常
   if (feraiseexcept(FE_INEXACT) != 0) {
      printf("Failed to raise the FE_INEXACT floating-point exception.");
      return 1;
   } else {
      printf("Successfully raised the FE_INEXACT floating-point exception.");
   }
   return 0;
}

输出

以下是输出 -

Successfully raised the FE_INEXACT floating-point exception.

示例 3

以下示例引发了 FE_OVERFLOW 和 FE_UNDERFLOW 浮点异常。此外,它还检查并报告了哪些异常被引发,这表明当包含 FE_OVERFLOW 或 FE_UNDERFLOW 时,也可能引发 FE_INEXACT 异常。

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

int main() {
	// 引发 FE_OVERFLOW 和 FE_UNDERFLOW 浮点异常
   if (feraiseexcept(FE_OVERFLOW | FE_UNDERFLOW) != 0) {
      printf("Failed to raise the specified floating-point exceptions.");
      return 1;
   } else {
      printf("Successfully raised the specified floating-point exceptions.");
   }

   // 检查当前引发了哪些异常
   int raised_excepts = fetestexcept(FE_ALL_EXCEPT);
   if (raised_excepts & FE_OVERFLOW) {
      printf("FE_OVERFLOW is raised.");
   }
   if (raised_excepts & FE_UNDERFLOW) {
      printf("FE_UNDERFLOW is raised.");
   }
   if (raised_excepts & FE_INEXACT) {
      printf("FE_INEXACT is also raised.");
   }
   return 0;
}

输出

以下是输出 -

Successfully raised the specified floating-point exceptions.
FE_OVERFLOW is raised.
FE_UNDERFLOW is raised.

❮ C 标准库 - <fenv.h>