C 库 - fegetenv() 函数
C fenv 库中的 fegetenv() 函数设置了包含小数的数字的控制流。
假设我们正在解决一道数学题,并且正在使用一个可以以不同方式对数字进行舍入的计算器。但是,我们需要切换到另一个具有不同舍入设置的计算器。因此,此函数就像保存了第一个计算器的状态,以便我们稍后可以返回该计算器并使用与之前完全相同的设置继续操作。
语法
以下是 fegetenv() 函数的 C 库语法。
int fegetenv(fenv_t *envp);
参数
此函数仅接受一个参数 -
- fen_v - 该函数接受一个指向 fenv_t 对象的指针,当前环境变量将存储在该对象中。
返回值
此函数返回整数值,
如果成功,则返回零。
-
如果无法获取环境变量,则返回非零值。
示例 1
以下是 C 库 fegetenv() 函数,演示了如何保存和恢复浮点数环境。
#include <stdio.h>
#include <fenv.h>
int main() {
fenv_t env;
// 保存当前浮点环境
fegetenv(&env);
// 在此处执行一些浮点运算
fesetenv(&env);
// 恢复已保存的环境
printf("Floating-point environment restored.");
return 0;
}
输出
上述代码产生以下结果 -
Floating-point environment restored.
示例 2
在本例中,程序执行了可能导致溢出的操作,恢复了环境并检查是否发生了溢出。
#include <fenv.h> #include <stdio.h> // 舍入方向模式 void rounding_mode() { printf("Rounding mode is ->"); switch (fegetround()) { case FE_TONEAREST: // Round to nearest printf("FE_TONEAREST"); break; case FE_DOWNWARD: // Round downward printf("FE_DOWNWARD"); break; case FE_UPWARD: // Round upward printf("FE_UPWARD"); break; case FE_TOWARDZERO: // Round toward zero printf("FE_TOWARDZERO"); break; default: printf("unknown"); }; } int main(void) { fenv_t envp; // 初始环境 printf("Initial environment :"); // 打印最初引发的异常 printf("Exception raised -> "); if (fetestexcept(FE_ALL_EXCEPT)) { if (fetestexcept(FE_DIVBYZERO)) printf("FE_DIVBYZERO "); if (fetestexcept(FE_INEXACT)) printf("FE_INEXACT "); if (fetestexcept(FE_INVALID)) printf("FE_INVALID "); if (fetestexcept(FE_OVERFLOW)) printf("FE_OVERFLOW "); if (fetestexcept(FE_UNDERFLOW)) printf("FE_UNDERFLOW "); } else printf("None"); // 打印舍入方向模式 rounding_mode(); // 当前环境 fegetenv(&envp); feraiseexcept(FE_ALL_EXCEPT); // 设置舍入方向模式 fesetround(FE_DOWNWARD); // 环境更改后 printf("Final environment :"); // 打印引发的异常 printf("Exception raised -> "); if (fetestexcept(FE_ALL_EXCEPT)) { if (fetestexcept(FE_DIVBYZERO)) printf("FE_DIVBYZERO "); if (fetestexcept(FE_INEXACT)) printf("FE_INEXACT "); if (fetestexcept(FE_INVALID)) printf("FE_INVALID "); if (fetestexcept(FE_OVERFLOW)) printf("FE_OVERFLOW "); if (fetestexcept(FE_UNDERFLOW)) printf("FE_UNDERFLOW "); } else printf("None"); // 打印舍入方向模式 rounding_mode(); return 0; }
输出
执行上述代码后,我们得到以下结果 -
Initial environment : Exception raised -> None Rounding mode is ->FE_TONEAREST Final environment : Exception raised -> FE_DIVBYZERO FE_INEXACT FE_INVALID FE_OVERFLOW FE_UNDERFLOW Rounding mode is ->FE_DOWNWARD