feholdexcept
From cppreference.net
|
定义于头文件
<fenv.h>
|
||
|
int
feholdexcept
(
fenv_t
*
envp
)
;
|
(C99 起) | |
首先,将当前浮点环境保存到
envp
所指向的对象(类似于
fegetenv
),随后清除所有浮点状态标志,并启用非停止模式:在此之后,浮点异常将不会中断执行(不会陷入陷阱),直到通过
feupdateenv
或
fesetenv
恢复浮点环境为止。
此函数可用于在子程序开始时隐藏可能引发的浮点异常,使其对调用方不可见。若只需屏蔽部分异常而报告其他异常,通常在清除不需要的异常后,通过调用 feupdateenv 来结束非停止模式。
目录 |
参数
| envp | - | 指向 fenv_t 类型对象的指针,浮点环境将被存储到该对象中 |
返回值
0 表示成功,非零值表示失败。
示例
运行此代码
#include <stdio.h> #include <fenv.h> #include <float.h> #pragma STDC FENV_ACCESS ON void show_fe_exceptions(void) { printf("当前引发的异常:"); 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"); if(fetestexcept(FE_ALL_EXCEPT)==0) printf(" 无"); printf("\n"); } double x2 (double x) /* 乘以二 */ { fenv_t curr_excepts; /* 保存并清除当前浮点环境 */ feholdexcept(&curr_excepts); /* 引发不精确和溢出异常 */ printf("在 x2() 中:x = %f\n", x=x*2.0); show_fe_exceptions(); feclearexcept(FE_INEXACT); /* 对调用者隐藏不精确异常 */ /* 将调用者的异常(FE_INVALID)与 */ /* x2 剩余的异常(FE_OVERFLOW)合并 */ feupdateenv(&curr_excepts); return x; } int main(void) { feclearexcept(FE_ALL_EXCEPT); feraiseexcept(FE_INVALID); /* 某些含无效参数的计算 */ show_fe_exceptions(); printf("x2(DBL_MAX) = %f\n", x2(DBL_MAX)); show_fe_exceptions(); return 0; }
输出:
当前引发的异常: FE_INVALID 在 x2() 中:x = inf 当前引发的异常: FE_INEXACT FE_OVERFLOW x2(DBL_MAX) = inf 当前引发的异常: FE_INVALID FE_OVERFLOW
参考文献
- C11 标准 (ISO/IEC 9899:2011):
-
- 7.6.4.2 feholdexcept 函数 (第 213-214 页)
- C99 标准 (ISO/IEC 9899:1999):
-
- 7.6.4.2 feholdexcept 函数 (第 194-195 页)
参见
|
(C99)
|
恢复浮点环境并触发先前引发的异常
(函数) |
|
(C99)
|
保存或恢复当前浮点环境
(函数) |
|
(C99)
|
默认浮点环境
(宏常量) |
|
C++ 文档
关于
feholdexcept
|
|