当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


C++ fegetenv()用法及代码示例


在头文件cfenv.h中指定了C /C++中的fegetenv()函数,并尝试将浮点环境的当前状态存储在envp指向的对象中。浮点环境是一组状态标志和控制模式,包括浮点异常和舍入方向模式。

用法:

int fegetenv( fenv_t* envp )

参数:该函数接受一个强制性参数envp,该参数指定一个对象,该对象存储浮点环境的状态。


返回值:该函数返回两个值,如下所示:

  • 成功时,它返回零。
  • 失败时,它返回非零。

以下示例程序旨在说明上述函数:
程序1:

// C++ program to illustrate 
// fegetenv() function 
  
#include <bits/stdc++.h> 
using namespace std; 
  
// rounding direction mode 
void rounding_mode() 
{ 
    cout << "Rounding mode is ->"; 
    switch (fegetround()) { 
    case FE_TONEAREST:
  
        // Round to nearest 
        cout << "FE_TONEAREST" << endl; 
        break; 
    case FE_DOWNWARD:
  
        // Round downward 
        cout << "FE_DOWNWARD" << endl; 
        break; 
    case FE_UPWARD:
  
        // Round upward 
        cout << "FE_UPWARD" << endl; 
        break; 
    case FE_TOWARDZERO:
  
        // Round toward zero 
        cout << "FE_TOWARDZERO" << endl; 
        break; 
    default:
        cout << "unknown" << endl; 
    }; 
} 
  
int main(void) 
{ 
    fenv_t envp; 
  
    // initial environment 
    cout << "Initial environment:" << endl; 
  
    // print the exception raised initially 
    cout << "Exception raised -> \n"; 
    if (fetestexcept(FE_ALL_EXCEPT)) { 
        if (fetestexcept(FE_DIVBYZERO)) 
            cout << "FE_DIVBYZERO " << endl; 
        if (fetestexcept(FE_INEXACT)) 
            cout << "FE_INEXACT " << endl; 
        if (fetestexcept(FE_INVALID)) 
            cout << "FE_INVALID " << endl; 
        if (fetestexcept(FE_OVERFLOW)) 
            cout << "FE_OVERFLOW " << endl; 
        if (fetestexcept(FE_UNDERFLOW)) 
            cout << "FE_UNDERFLOW " << endl; 
    } 
    else
        cout << "None" << endl; 
  
    // print the rounding direction mode 
    rounding_mode(); 
  
    // Current environment 
    fegetenv(&envp); 
    feraiseexcept(FE_INVALID); 
  
    // Set rounding direction mode 
    fesetround(FE_DOWNWARD); 
  
    // after environment is change 
    cout << endl 
         << "Final environment:" << endl; 
  
    // print the exception raised 
    cout << "Exception raised -> \n"; 
    if (fetestexcept(FE_ALL_EXCEPT)) { 
        if (fetestexcept(FE_DIVBYZERO)) 
            cout << "FE_DIVBYZERO " << endl; 
        if (fetestexcept(FE_INEXACT)) 
            cout << "FE_INEXACT " << endl; 
        if (fetestexcept(FE_INVALID)) 
            cout << "FE_INVALID " << endl; 
        if (fetestexcept(FE_OVERFLOW)) 
            cout << "FE_OVERFLOW " << endl; 
        if (fetestexcept(FE_UNDERFLOW)) 
            cout << "FE_UNDERFLOW " << endl; 
    } 
    else
        cout << "None" << endl; 
  
    // print the rounding direction mode 
    rounding_mode(); 
  
    return 0; 
}
输出:
Initial environment:
Exception raised -> 
None
Rounding mode is ->FE_TONEAREST

Final environment:
Exception raised -> 
FE_INVALID 
Rounding mode is ->FE_DOWNWARD

程序2:

// C++ program to illustrate 
// fegetenv() function 
  
#include <bits/stdc++.h> 
using namespace std; 
  
// rounding direction mode 
void rounding_mode() 
{ 
    cout << "Rounding mode is ->"; 
    switch (fegetround()) { 
    case FE_TONEAREST:
  
        // Round to nearest 
        cout << "FE_TONEAREST" << endl; 
        break; 
    case FE_DOWNWARD:
  
        // Round downward 
        cout << "FE_DOWNWARD" << endl; 
        break; 
    case FE_UPWARD:
  
        // Round upward 
        cout << "FE_UPWARD" << endl; 
        break; 
    case FE_TOWARDZERO:
  
        // Round toward zero 
        cout << "FE_TOWARDZERO" << endl; 
        break; 
    default:
        cout << "unknown" << endl; 
    }; 
} 
  
int main(void) 
{ 
    fenv_t envp; 
  
    // initial environment 
    cout << "Initial environment:" << endl; 
  
    // print the exception raised initially 
    cout << "Exception raised -> \n"; 
    if (fetestexcept(FE_ALL_EXCEPT)) { 
        if (fetestexcept(FE_DIVBYZERO)) 
            cout << "FE_DIVBYZERO " << endl; 
        if (fetestexcept(FE_INEXACT)) 
            cout << "FE_INEXACT " << endl; 
        if (fetestexcept(FE_INVALID)) 
            cout << "FE_INVALID " << endl; 
        if (fetestexcept(FE_OVERFLOW)) 
            cout << "FE_OVERFLOW " << endl; 
        if (fetestexcept(FE_UNDERFLOW)) 
            cout << "FE_UNDERFLOW " << endl; 
    } 
    else
        cout << "None" << endl; 
  
    // print the rounding direction mode 
    rounding_mode(); 
  
    // Current environment 
    fegetenv(&envp); 
    feraiseexcept(FE_ALL_EXCEPT); 
  
    // Set rounding direction mode 
    fesetround(FE_DOWNWARD); 
  
    // after environment is change 
    cout << endl 
         << "Final environment:" << endl; 
  
    // print the exception raised 
    cout << "Exception raised -> \n"; 
    if (fetestexcept(FE_ALL_EXCEPT)) { 
        if (fetestexcept(FE_DIVBYZERO)) 
            cout << "FE_DIVBYZERO " << endl; 
        if (fetestexcept(FE_INEXACT)) 
            cout << "FE_INEXACT " << endl; 
        if (fetestexcept(FE_INVALID)) 
            cout << "FE_INVALID " << endl; 
        if (fetestexcept(FE_OVERFLOW)) 
            cout << "FE_OVERFLOW " << endl; 
        if (fetestexcept(FE_UNDERFLOW)) 
            cout << "FE_UNDERFLOW " << endl; 
    } 
    else
        cout << "None" << endl; 
  
    // print the rounding direction mode 
    rounding_mode(); 
  
    return 0; 
}
输出:
Initial environment:
Exception raised -> 
None
Rounding mode is ->FE_TONEAREST

Final environment:
Exception raised -> 
FE_DIVBYZERO 
FE_INEXACT 
FE_INVALID 
FE_OVERFLOW 
FE_UNDERFLOW 
Rounding mode is ->FE_DOWNWARD


相关用法


注:本文由纯净天空筛选整理自AmanSrivastava1大神的英文原创作品 fegetenv() function in C/C++。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。