feclearexcept
From cppreference.net
|
定义于头文件
<fenv.h>
|
||
|
int
feclearexcept
(
int
excepts
)
;
|
(C99 起) | |
尝试清除位掩码参数
excepts
中列出的浮点异常,该参数是
浮点异常宏
的按位或组合。
目录 |
参数
| excepts | - | 列出要清除的异常标志的位掩码 |
返回值
0
如果所有指定异常均被成功清除,或当
excepts
为零时。发生错误时返回非零值。
示例
运行此代码
#include <fenv.h> #include <stdio.h> #include <math.h> #include <float.h> /* * 一个可能实现的hypot函数,运用了多种高级浮点数特性。 */ double hypot_demo(double a, double b) { const int range_problem = FE_OVERFLOW | FE_UNDERFLOW; feclearexcept(range_problem); // 尝试快速算法 double result = sqrt(a * a + b * b); if (!fetestexcept(range_problem)) // 无溢出或下溢 return result; // 返回快速计算结果 // 执行更复杂的计算以避免溢出或下溢 int a_exponent,b_exponent; frexp(a, &a_exponent); frexp(b, &b_exponent); if (a_exponent - b_exponent > DBL_MAX_EXP) return fabs(a) + fabs(b); // 可忽略较小值 // 缩放使fabs(a)接近1 double a_scaled = scalbn(a, -a_exponent); double b_scaled = scalbn(b, -a_exponent); // 此时不可能出现溢出或下溢 result = sqrt(a_scaled * a_scaled + b_scaled * b_scaled); // 还原缩放 return scalbn(result, a_exponent); } int main(void) { // 常规情况采用快速路径 printf("hypot(%f, %f) = %f\n", 3.0, 4.0, hypot_demo(3.0, 4.0)); // 极端情况采用缓慢但更精确的路径 printf("hypot(%e, %e) = %e\n", DBL_MAX / 2.0, DBL_MAX / 2.0, hypot_demo(DBL_MAX / 2.0, DBL_MAX / 2.0)); return 0; }
输出:
hypot(3.000000, 4.000000) = 5.000000 hypot(8.988466e+307, 8.988466e+307) = 1.271161e+308
参考文献
- C11 标准 (ISO/IEC 9899:2011):
-
- 7.6.2.1 feclearexcept 函数 (p: 209)
- C99 标准 (ISO/IEC 9899:1999):
-
- 7.6.2.1 feclearexcept 函数 (p: 190)
参阅
|
(C99)
|
确定哪些指定的浮点状态标志被设置
(函数) |
|
C++ 文档
for
feclearexcept
|
|