Skip to content

fenv.h

<fenv.h> 是 C 标准库中的一个头文件,用于控制浮点环境(Floating-Point Environment)。

<fenv.h> 在 C99 标准中引入,提供了对浮点异常、舍入模式和其他浮点状态的控制和查询功能。

1、浮点异常

浮点异常是指在浮点运算中发生的特殊情况,例如:

cpp
FE_DIVBYZERO:除以零。

FE_INEXACT:不精确结果。

FE_INVALID:无效操作(如对负数开平方)。

FE_OVERFLOW:上溢。

FE_UNDERFLOW:下溢。

这些异常通过浮点状态标志来表示,可以通过 <fenv.h> 中的函数检测和处理。

2、舍入模式

舍入模式控制浮点运算结果的舍入方式。<fenv.h> 定义了以下舍入模式:

cpp
FE_TONEAREST:向最接近的值舍入(默认模式)。

FE_DOWNWARD:向负无穷舍入。

FE_UPWARD:向正无穷舍入。

FE_TOWARDZERO:向零舍入。

3、主要函数和宏

浮点异常处理

函数/宏描述
feclearexcept(int excepts)清除指定的浮点异常标志
feraiseexcept(int excepts)触发指定的浮点异常
fetestexcept(int excepts)测试指定的浮点异常是否发生
fegetexceptflag(fexcept_t *flagp, int excepts)获取浮点异常标志状态
fesetexceptflag(const fexcept_t *flagp, int excepts)设置浮点异常标志状态

舍入模式控制

函数/宏描述
fegetround(void)获取当前舍入模式
fesetround(int round)设置当前舍入模式

浮点环境控制

函数/宏描述
fegetenv(fenv_t *envp)保存当前浮点环境
fesetenv(const fenv_t *envp)恢复浮点环境
feholdexcept(fenv_t *envp)保存当前浮点环境并清除异常标志
feupdateenv(const fenv_t *envp)恢复浮点环境并触发异常

示例

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

int main() {
    // 启用浮点异常检测
    feclearexcept(FE_ALL_EXCEPT);

    // 触发除以零异常
    double x = 1.0, y = 0.0;
    double z = x / y;

    // 检测是否发生除以零异常
    if (fetestexcept(FE_DIVBYZERO)) {
        printf("Divide by zero exception occurred.\n");
    }

    // 设置舍入模式为向零舍入
    fesetround(FE_TOWARDZERO);

    // 测试舍入模式
    double a = 1.5;
    double b = rint(a); // 舍入到整数
    printf("Rounding 1.5 toward zero: %.1f\n", b);

    return 0;
}

运行结果

shell
gcc main.c -o main && ./main
Divide by zero exception occurred.
Rounding 1.5 toward zero: 1.0