C++ 参考手册
- C++11
- C++14
- C++17
- C++20
- C++ 编译器支持情况表
- 独立与宿主实现
- C++ 语言
- C++ 关键词
- 预处理器
- C++ 标准库头文件
- 具名要求
- 功能特性测试 (C++20)
- 工具库
- 类型支持(基本类型、RTTI、类型特性)
- 概念库 (C++20)
- 错误处理
- 动态内存管理
- 日期和时间工具
- 字符串库
- 容器库
- 迭代器库
- 范围库 (C++20)
- 算法库
- 数值库
- 常用数学函数
- 数学特殊函数
- 伪随机数生成
- 浮点环境
- std::feclearexcept
- std::fetestexcept
- std::feraiseexcept
- std::fegetexceptflag, std::fesetexceptflag
- std::fegetround, std::fesetround
- std::fegetenv, std::fesetenv
- std::feholdexcept
- std::feupdateenv
- FE_DIVBYZERO, FE_INEXACT, FE_INVALID, FE_OVERFLOW, FE_UNDERFLOW, FE_ALL_EXCEPT
- FE_DOWNWARD, FE_TONEAREST, FE_TOWARDZERO, FE_UPWARD
- FE_DFL_ENV
- std::midpoint
- std::lerp
- std::has_single_bit
- std::bit_ceil
- std::bit_floor
- std::bit_width
- std::rotl
- std::complex
- std::valarray
- 编译时有理数算术
- std::gcd
- std::lcm
- 数学常数
- std::bit_cast
- std::rotr
- std::countl_zero
- std::countl_one
- std::countr_zero
- std::countr_one
- std::popcount
- 注释
- 输入/输出库
- 文件系统库
- 本地化库
- 正则表达式库
- 原子操作库
- 线程支持库
- 实验性 C++ 特性
- 有用的资源
- 索引
- std 符号索引
- 协程支持 (C++20)
- C++ 关键词
浮点环境
浮点环境是实现所支持的浮点状态标志集合及控制模式。它是线程局域的,每个线程从亲线程继承其浮点环境的初始状态。浮点运算修改浮点状态标志,以指示异常结果或辅助信息。浮点控制模式的状态影响一些浮点运算的产出。
浮点环境访问和修改仅在
#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++ 异常。