- C 标准库
- C 标准库
- C++ 标准库
- C++ 库 - 首页
- C++ 库 - <fstream>
- C++ 库 - <iomanip>
- C++ 库 - <ios>
- C++ 库 - <iosfwd>
- C++ 库 - <iostream>
- C++ 库 - <istream>
- C++ 库 - <ostream>
- C++ 库 - <sstream>
- C++ 库 - <streambuf>
- C++ 库 - <atomic>
- C++ 库 - <complex>
- C++ 库 - <exception>
- C++ 库 - <functional>
- C++ 库 - <limits>
- C++ 库 - <locale>
- C++ 库 - <memory>
- C++ 库 - <new>
- C++ 库 - <numeric>
- C++ 库 - <regex>
- C++ 库 - <stdexcept>
- C++ 库 - <string>
- C++ 库 - <thread>
- C++ 库 - <tuple>
- C++ 库 - <typeinfo>
- C++ 库 - <utility>
- C++ 库 - <valarray>
- C++ STL 库
- C++ 库 - <array>
- C++ 库 - <bitset>
- C++ 库 - <deque>
- C++ 库 - <forward_list>
- C++ 库 - <list>
- C++ 库 - <map>
- C++ 库 - <multimap>
- C++ 库 - <queue>
- C++ 库 - <priority_queue>
- C++ 库 - <set>
- C++ 库 - <stack>
- C++ 库 - <unordered_map>
- C++ 库 - <unordered_set>
- C++ 库 - <vector>
- C++ 库 - <algorithm>
- C++ 库 - <iterator>
- C++ 高级库
- C++ 库 - <any>
- C++ 库 - <barrier>
- C++ 库 - <bit>
- C++ 库 - <chrono>
- C++ 库 - <cinttypes>
- C++ 库 - <clocale>
- C++ 库 - <condition_variable>
- C++ 库 - <coroutine>
- C++ 库 - <cstdlib>
- C++ 库 - <cstring>
- C++ 库 - <cuchar>
- C++ 库 - <charconv>
- C++ 库 - <cfenv>
- C++ 库 - <cmath>
- C++ 库 - <ccomplex>
- C++ 库 - <expected>
- C++ 库 - <format>
- C++ 库 - <future>
- C++ 库 - <flat_set>
- C++ 库 - <flat_map>
- C++ 库 - <filesystem>
- C++ 库 - <generator>
- C++ 库 - <initializer_list>
- C++ 库 - <latch>
- C++ 库 - <memory_resource>
- C++ 库 - <mutex>
- C++ 库 - <mdspan>
- C++ 库 - <optional>
- C++ 库 - <print>
- C++ 库 - <ratio>
- C++ 库 - <scoped_allocator>
- C++ 库 - <semaphore>
- C++ 库 - <source_location>
- C++ 库 - <span>
- C++ 库 - <spanstream>
- C++ 库 - <stacktrace>
- C++ 库 - <stop_token>
- C++ 库 - <syncstream>
- C++ 库 - <system_error>
- C++ 库 - <string_view>
- C++ 库 - <stdatomic>
- C++ 库 - <variant>
- C++ STL 库速查表
- C++ STL - 速查表
C++ 库 - <cfenv>
C++ 中的<cfenv> 头文件提供了各种函数来处理浮点环境,包括浮点舍入模式和异常处理。
浮点环境维护一系列状态标志和控制模式,指示是否发生任何特定的浮点错误。舍入模式指的是在算术运算期间如何舍入浮点数。
包含 <cfenv> 头文件
要在 C++ 程序中包含 <cfenv> 头文件,可以使用以下语法。
#include <cfenv>
<cfenv> 头文件的函数
以下是 <cfenv> 头文件中所有函数的列表。
舍入方向函数
<cfenv> 头文件提供了一些舍入模式,使用这些模式可以控制浮点运算的舍入方向。
序号 | 函数和描述 |
---|---|
1 | fegetround(void)
此函数返回一个值,该值指示当前浮点环境中的舍入方向模式。 |
2 | fesetround(int rdir)
将 rdir 设置为浮点环境的当前舍入方向模式。 |
获取当前舍入模式
在下面的示例中,我们将使用 fegetround() 来获取浮点环境的当前舍入方向模式。
#include <iostream> #include <cfenv> int main() { std::fesetround(FE_DOWNWARD); int round_mode = std::fegetround(); if (round_mode == FE_DOWNWARD) std::cout << "Rounding mode: Downward" << std::endl; else std::cout << "Other rounding mode" << std::endl; }
输出
如果我们运行上面的代码,它将生成以下输出:
Rounding mode: Downward
浮点异常
在 C++ 中,当浮点运算导致错误条件(例如除以零或溢出)时发生浮点异常。一些常见的浮点异常如下。
序号 | 函数和描述 |
---|---|
1 | feclearexcept()
此函数尝试清除由 excepts 指定的浮点异常。 |
2 | feraiseexcept()
此函数尝试引发由 excepts 指定的浮点异常。 |
3 | fegetexceptflag()
此函数尝试将由 excepts 指定的浮点异常的表示存储到对象中。 |
4 | fesetexceptflag()
此函数尝试使用存储在对象中的状态设置由 excepts 指示的异常。 |
清除浮点异常
在下面的示例中,我们将使用 feclearexcept() 来清除特定的浮点异常。
#include <iostream> #include <cfenv> #pragma STDC FENV_ACCESS ON int main() { std::feclearexcept(FE_DIVBYZERO); volatile double result = 1.0 / 0.0; if (std::fetestexcept(FE_DIVBYZERO)) std::cout << "Division by zero exception detected" << std::endl; else std::cout << "No exception" << std::endl; }
输出
如果我们运行上面的代码,它将生成以下输出:
Division by zero exception detected
操作整个浮点环境
C++ 提供了函数来一次保存、恢复或修改整个环境。浮点环境同时包括当前舍入模式和异常标志。
序号 | 函数和描述 |
---|---|
1 | fesetenv()
此函数尝试将浮点环境的当前状态存储到对象中。 |
2 | fesetenv()
此函数尝试根据对象中表示的状态来建立浮点环境的状态。 |
3 | feholdexcept()
此函数将浮点环境的当前状态保存到对象中。 |
4 | feupdateenv()
此函数尝试根据对象中表示的状态来建立浮点环境的状态。 |
5 | fetestexcept()
此函数返回当前设置的异常(在由 excepts 指定的异常中)。 |
保存和恢复环境
在下面的示例中,我们将使用 feholdexcept() 来保存当前浮点环境(舍入模式和异常标志)并清除异常标志。
#include <iostream> #include <cfenv> #pragma STDC FENV_ACCESS ON int main() { fenv_t env; std::feholdexcept(&env); volatile double result = 1.0 / 0.0; if (std::fetestexcept(FE_DIVBYZERO)) std::cout << "Division by zero detected!" << std::endl; std::fesetenv(&env); }
输出
如果我们运行上面的代码,它将生成以下输出:
Division by zero detected!