浮点环境
浮点环境是实现所支持的浮点状态标志集合及控制模式。它是线程局域的,每个线程从亲线程继承其浮点环境的初始状态。浮点运算修改浮点状态标志,以指示异常结果或辅助信息。浮点控制模式的状态影响一些浮点运算的产出。
浮点环境访问和修改仅在
#pragma STDC FENV_ACCESS 得到支持并被设为 ON
时有意义。否则实现有假设浮点控制模式始终是默认者,且浮点状态标志决不被测试或被修改的自由。实践中,少数当前编译器,例如 HP aCC 、 Oracle Studio 或 IBM XL 显式支持 #pragma
,但无论如何,大多数编译器允许有意义地访问浮点环境。
类型
定义于头文件
<cfenv> | |
fenv_t | 表示整个浮点环境的类型 |
fexcept_t | 汇集地表示所有浮点状态标志的类型 |
函数
(C++11) |
清除指定的浮点状态标志 (函数) |
(C++11) |
确定设置了哪个指定的浮点状态标志 (函数) |
(C++11) |
引发指定的浮点异常 (函数) |
(C++11)(C++11) |
从浮点环境(或向其中)复制指定的浮点状态标志 (函数) |
(C++11)(C++11) |
获取或设置舍入方向 (函数) |
(C++11) |
保存或恢复当前浮点环境 (函数) |
(C++11) |
保存环境,清除所有状态标志,并忽略所有将来的错误 (函数) |
(C++11) |
恢复浮点环境并引发之前引发的异常 (函数) |
宏
浮点异常 (宏常量) | |
浮点舍入方向 (宏常量) | |
(C++11) |
默认浮点环境 (宏常量) |
注意
浮点异常与 C++ 异常无关。浮点运算引发浮点异常时,浮点环境的状态改变,这能用 std::fetestexcept 测试,但绝大多数实现上 C++ 程序执行持续而不中断。
有编译器扩展,可用于凡在引发浮点异常时自动生成 C++ 异常:
- GNU libc 函数
feenableexcept()
启用浮点异常的陷阱,它生成信号SIGFPE
。若使用编译器选项-fnon-call-exceptions
,则该信号的处理函数可抛出用户定义的 C++ 异常。 - MSVC 函数
_control87()
启用浮点异常的陷阱,它生成硬件异常,这能用_set_se_translator
转换成 C++ 异常。