当前位置: C语言 -- 标准库 -- <fenv.h> -- feholdexcept

feholdexcept函数


概要:
#include <fenv.h>
int feholdexcept(fenv_t *envp);

描述:

该函数将当前浮点环境存储到参数envp指向的对象中,清除浮点状态标志,然后为所有浮点异常安装不间断模式(如果可用)。

安装不间断模式(non-stop mode)后,调用feupdateenv函数或者fesetenv函数恢复浮点环境前,浮点异常不会中断程序执行。

IEC 60559系统存在默认的不间断模式,并且通常至少有一种用于陷阱处理或者中止的其它模式;如果系统仅提供不间断模式,那么安装它意义不大。对于这样的系统,feholdexcept函数可以和feupdateenv函数结合使用,编写对调用者隐藏伪浮点异常的例程。

如果子程序需要隐藏调用者引发的浮点异常,可以在子程序开头调用feholdexcept函数。如果有些异常需要隐藏,而有些异常又必须报告,通常在清除需要隐藏的异常后调用feupdateenv函数结束不间断模式。

函数fegetenvfeholdexceptfesetenvfeupdateenv将浮点环境(状态标志和控制模式)作为一个整体操作。


参数:
fenv_t *envp

参数为一个指向fenv_t类型对象的指针。


返回值:

当且仅当成功安装了不间断浮点异常处理,函数返回0


范例:
1 
2 
3 
4 
5 
6 
7 
8 
9 
10 
11 
12 
13 
14 
15 
16 
17 
18 
19 
20 
21 
22 
23 
24 
25 
26 
27 
28 
29 
30 
31 
32 
33 
34 
35 
36 
37 
38 
39 
40 
41 
42 
43 
44 
45 
46 
47 
48 
49 
50 
51 
52 
53 
54 
55 
56 
57 
58 
59 
60 
61 
62 
63 
64 
65 
66 
67 
68 
69 
70 
71 
72 
73 
74 
75 
76 
77 
78 
79 
80 
81 
82 
83 
84 
85 
/*函数feholdexcept范例*/

#include <fenv.h>
#include <math.h>
#include <stdio.h>

#pragma STDC FENV_ACCESS ON

void showExceptions(void)
{
    printf("Exceptions: ");
    /*判断是否设置浮点异常。*/
    if(fetestexcept(FE_ALL_EXCEPT)==0)
    {
        puts("No floating-point status flag is set.");
    }
    else
    {
    	/*判断设置的浮点异常。*/
        if(fetestexcept(FE_DIVBYZERO))
            printf("FE_DIVBYZERO ");
        if(fetestexcept(FE_INEXACT))
            printf("FE_INEXACT ");
        if(fetestexcept(FE_INVALID))
            printf("FE_INVALID ");
        if(fetestexcept(FE_OVERFLOW))
            printf("FE_OVERFLOW ");
        if(fetestexcept(FE_UNDERFLOW))
            printf("FE_UNDERFLOW ");
        puts("");
    }
}

void showRoundingDirection(void)
{
    printf("Rounding direction: ");
    switch(fegetround())
    {
    case FE_DOWNWARD:
        puts("FE_DOWNWARD");
        break;
    case FE_TOWARDZERO:
        puts("FE_TOWARDZERO");
        break;
    case FE_UPWARD:
        puts("FE_UPWARD");
        break;
    default:
        puts("FE_TONEAREST");
        break;
    }
}

void showFloatingPointEnvironment(void)
{
    showExceptions();
    showRoundingDirection();
    puts("");
}

int main(void)
{
    double x;
    fenv_t currentEnv;

    /*第一阶段的浮点环境。*/
    x = exp(1000.0);
    printf("Stage 1 floating-point environment\n");
    showFloatingPointEnvironment();
    feholdexcept(&currentEnv);

    /*第二阶段的浮点环境。*/
    fesetround(FE_UPWARD);
    x = exp(-1000.0);
    printf("Stage 2 floating-point environment\n");
    showFloatingPointEnvironment();

    /*第三阶段的浮点环境。*/
    fesetenv(&currentEnv);
    printf("Stage 3 floating-point environment\n");
    showFloatingPointEnvironment();

    return 0;
}


输出:

Stage 1 floating-point environment

Exceptions: FE_INEXACT FE_OVERFLOW

Rounding direction: FE_TONEAREST

 

Stage 2 floating-point environment

Exceptions: FE_INEXACT FE_UNDERFLOW

Rounding direction: FE_UPWARD

 

Stage 3 floating-point environment

Exceptions: FE_INEXACT FE_OVERFLOW

Rounding direction: FE_TONEAREST

注:使用GCC编译。


相关内容:
fegetenv 获取浮点环境的函数。
fesetenv 设置浮点环境的函数。
feupdateenv 更新浮点环境的函数。