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!
廣告