浮点环境

来自cppreference.com
< cpp‎ | numeric

浮点环境是实现所支持的浮点状态标志集合及控制模式。它是线程局域的,每个线程从亲线程继承其浮点环境的初始状态。浮点运算修改浮点状态标志,以指示异常结果或辅助信息。浮点控制模式的状态影响一些浮点运算的产出。

浮点环境访问和修改仅在 #pragma STDC FENV_ACCESS 得到支持并被设为 ON 时有意义。否则实现有假设浮点控制模式始终是默认者,且浮点状态标志决不被测试或被修改的自由。实践中,少数当前编译器,例如 HP aCC 、 Oracle Studio 或 IBM XL 显式支持 #pragma ,但无论如何,大多数编译器允许有意义地访问浮点环境。

类型

在标头 <cfenv> 定义
fenv_t 表示整个浮点环境的类型
fexcept_t 汇集地表示所有浮点状态标志的类型

函数

清除指定的浮点状态标志
(函数)
确定设置了哪个指定的浮点状态标志
(函数)
引发指定的浮点异常
(函数)
从浮点环境(或向其中)复制指定的浮点状态标志
(函数)
(C++11)(C++11)
获取或设置舍入方向
(函数)
保存或恢复当前浮点环境
(函数)
保存环境,清除所有状态标志,并忽略所有将来的错误
(函数)
恢复浮点环境并引发之前引发的异常
(函数)

浮点异常
(宏常量)
浮点舍入方向
(宏常量)
默认浮点环境
(宏常量)

注意

浮点异常与 C++ 异常无关。浮点运算引发浮点异常时,浮点环境的状态改变,这能用 std::fetestexcept 测试,但绝大多数实现上 C++ 程序执行持续而不中断。

有编译器扩展,可用于凡在引发浮点异常时自动生成 C++ 异常:

  • GNU libc 函数 feenableexcept() 启用浮点异常的陷阱,它生成信号 SIGFPE 。若使用编译器选项 -fnon-call-exceptions ,则该信号的处理函数可抛出用户定义的 C++ 异常。
  • MSVC 函数 _control87() 启用浮点异常的陷阱,它生成硬件异常,这能用 _set_se_translator 转换成 C++ 异常。

参阅