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

FE_UNDERFLOW宏


概要:

#define FE_UNDERFLOW value //value值由实现定义,为2的N次方。


描述:

该宏表示下溢范围异常,该宏会扩展为int类型的常量表达式,其值是2N次方。由于操作结果(可能是正值,也可能是负值。)的绝对值太小,以至于在没有异常舍入误差的情况下函数的返回类型不能表示操作结果,将发生下溢范围异常。发生下溢范围异常时,函数返回一个实现定义值,其绝对值不大于返回类型最小正规格化数(the smallest normalized positive number)。操作是否会引发下溢范围异常将由实现定义。

当且仅当实现通过feclearexceptfegetexceptflagferaiseexceptfesetexceptflagfetestexcept函数支持浮点异常时,宏FE_UNDERFLOW才会被定义。


范例:
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 
/*宏FE_UNDERFLOW范例*/

#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("");
    }
    
    /*清除设置的浮点异常。*/
    feclearexcept(FE_ALL_EXCEPT);
}

int main(void)
{
    feclearexcept(FE_ALL_EXCEPT);
    double result = exp(-1000.0);
    showExceptions();

    return 0;
}


输出:

Exceptions: FE_INEXACT FE_UNDERFLOW

在这个例子中,double类型不能表示exp(-1000.0)函数的返回值。


相关内容:
FE_ALL_EXCEPT 表示所有异常的宏。
FE_DIVBYZERO 表示极点异常的宏。
FE_INEXACT 表示不准确结果异常的宏。
FE_INVALID 表示域异常的宏。
FE_OVERFLOW 表示溢出范围异常的宏。