Namespaces
Variants

Floating-point environment (since C++11)

From cppreference.net
Floating-point environment
Functions
(C++11) (C++11)
(C++11) (C++11)
Macro constants
(C++11)

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

浮点环境的访问和修改仅在支持 #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++异常无关。当浮点运算引发浮点异常时,浮点环境的状态会发生改变,这可以通过 std::fetestexcept 进行检测,但在大多数实现中C++程序的执行会持续不受中断。

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

  • GNU libc 函数 feenableexcept() 可启用浮点异常捕获,该操作会生成 SIGFPE 信号。若编译时使用了 -fnon-call-exceptions 选项,该信号的处理程序可抛出用户自定义的 C++ 异常。
  • MSVC 函数 _control87() 可启用浮点异常捕获,该操作会生成硬件异常,此类异常可通过 _set_se_translator 转换为 C++ 异常。

参见

C 文档 关于 浮点环境