std::fetestexcept返回值能否同时设置多个标志位?
std::fetestexcept 返回值说明
std::fetestexcept 的返回值可以包含多个被设置的标志位,并非只能返回单个标志位。
它的核心逻辑如下:
- 传入参数是一个标志位掩码,用于指定要检测的浮点异常类型范围
- 函数返回一个整数,所有在掩码范围内且已被触发的异常标志,对应的位都会被置为1
- 比如同时触发
FE_DIVBYZERO和FE_OVERFLOW时,传入FE_ALL_EXCEPT作为掩码,返回值会是FE_DIVBYZERO | FE_OVERFLOW的位组合结果
示例代码:
#include <cfenv> #include <cmath> #include <iostream> int main() { std::feclearexcept(FE_ALL_EXCEPT); // 清除所有异常标志 std::sqrt(-1.0); // 触发FE_INVALID异常 std::pow(1e308, 2); // 触发FE_OVERFLOW异常 int flags = std::fetestexcept(FE_INVALID | FE_OVERFLOW); if (flags & FE_INVALID) { std::cout << "FE_INVALID 标志位已设置\n"; } if (flags & FE_OVERFLOW) { std::cout << "FE_OVERFLOW 标志位已设置\n"; } // 此时flags的值为 FE_INVALID | FE_OVERFLOW return 0; }
如果仅传入单个标志位作为掩码,返回值只会反映该标志位的状态,但这是参数限制导致的,函数本身完全支持检测并返回多个标志位的组合状态。
内容的提问来源于stack exchange,提问作者Dess
相关产品推荐
相关产品推荐

