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