📜  带有示例的C++中的feclearexcept(1)

📅  最后修改于: 2023-12-03 15:25:29.435000             🧑  作者: Mango

带有示例的C++中的 feclearexcept

在C++中,feclearexcept函数用于清除浮点异常的状态标志,在以后的计算中将不会影响到。该函数需要使用头文件进行引用。

语法
#include <cfenv>
int feclearexcept(int exceptions);
  • exceptions:需要清除的浮点异常,可以为以下常量中的一个或多个的按位或操作结果:
    • FE_DIVBYZERO:在浮点数除以零时抛出
    • FE_INEXACT:无法精确地表示结果的浮点数运算,如2.0/3.0这种
    • FE_INVALID:在非法操作时抛出,例如sqrt(-1)
    • FE_OVERFLOW:在溢出时抛出,例如exp(1000.0)
    • FE_UNDERFLOW:在下溢时抛出,例如exp(-1000.0)
返回值

函数执行成功则返回零,否则返回非零值。

代码示例
#include <iostream>
#include <cfenv>
#pragma STDC FENV_ACCESS on

using namespace std;

int main() {
    // 示例代码:打印除以零异常
    double a = 10, b = 0, res;
    int excepts = fegetexceptflag(nullptr, FE_ALL_EXCEPT);
    feclearexcept(FE_ALL_EXCEPT);
    res = a / b;
    excepts = fetestexcept(FE_ALL_EXCEPT);
    if (excepts & FE_DIVBYZERO)
        cout << "Divide by zero exception." << endl;
    else
        cout << "Result: " << res;
    return 0;
}

输出:

Divide by zero exception.

此代码演示了如何使用feclearexcept函数清除浮点异常标志。在此示例中,我们想要除以零时抛出FE_DIVBYZERO异常,但在调用除法运算符之前,我们先使用feclearexcept清除了浮点异常标志。因此,在我们执行除法之前,标志已经被清除,即使除数为0,它也不会抛出异常。但是,这里我们调用fetestexcept来检查是否有除以零的异常。

在上面的代码之前,我们使用了(#pragma STDC FENV_ACCESS on)来开启 IEEE 754 浮点状态改变的保护。它允许程序员改变浮点状态并向标志(flag)写入值,如果没有该条语句,则结果是未定义的。