
- 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++ 程式設計資源
- C++ 程式設計教程
- C++ 有用資源
- C++ 討論
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!