浮点数环境 (C++11 起)
来自cppreference.com
浮点数环境是实现所支持的浮点数状态标志及控制模式的集合。它是线程局部的,每个线程从父线程继承其浮点数环境的初始状态。浮点数运算修改浮点数状态标志,以指示异常结果或辅助信息。浮点数控制模式的状态对一些浮点数运算的产出有影响。
浮点数环境访问和修改仅在 #pragma STDC FENV_ACCESS 得到支持并被设为 ON
时有意义。否则实现有假设浮点数控制模式始终是默认,且浮点数状态标志决不被测试或被修改的自由。实践中,少数当前编译器,例如 HP aCC、Oracle Studio 或 IBM XL 显式支持 #pragma
,但无论如何,大多数编译器允许有意义地访问浮点数环境。
目录 |
[编辑]类型
在标头 <cfenv> 定义 | |
fenv_t (C++11) | 表示浮点数环境整体的类型 (typedef) |
fexcept_t (C++11) | 汇集地表示所有浮点数状态标志的类型 (typedef) |
[编辑]函数
(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++ 异常。
[编辑]参阅
浮点数环境 的 C 文档 |