浮点环境
来自 cppreference.com
浮点环境是实现支持的浮点状态标志和控制模式的集合。它是线程局部的。每个线程从父线程继承其浮点环境的初始状态。浮点运算修改浮点状态标志以指示异常结果或辅助信息。浮点控制模式的状态会影响某些浮点运算的结果。
只有在 #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++ 异常。
[编辑] 参见
C 文档 用于 浮点环境
|