说明

这11个函数在C99中定义,并描述了浮点舍入和异常(溢出,零除等)的处理。

Exceptions

当对有限数的运算产生无穷大作为精确答案时,就会发生零除异常。

当必须将结果表示为浮点数,但是绝对值比可表示的最大(有限)浮点数大得多时,就会发生溢出异常。

当必须将结果表示为浮点数时,发生下溢异常,但是绝对值小于最小的正归一化浮点数(当将其表示为非归一化数时,其准确性会降低)。

当运算的舍入结果与无限精度结果不相等时,将发生不精确异常。只要发生上溢或下溢,就可能发生。

当没有明确定义的操作结果(例如0/0或无穷大-无穷大或sqrt(-1))时,将发生无效异常。

Exception handling

异常以两种方式表示:单个位(存在/不存在异常),这些位以某种实现定义的方式与整数中的位位置相对应,还表示为不透明的结构,其中可能包含有关异常的更多信息(也许是发生的代码地址)。

当实现支持相应异常的处理时,将定义宏FE_DIVBYZEROFE_INEXACTFE_INVALIDFE_OVERFLOW,FE_UNDERFLOW中的每个宏,如果这样,则定义相应的位,以便可以调用异常处理函数,例如,使用整数参数FE_OVERFLOW | FE_UNDERFLOW。可能支持其他例外。宏FE_ALL_EXCEPT是与支持的异常对应的所有位的按位或。

feclearexcept()函数清除其参数中的位表示的受支持的异常。

fegetexceptflag()函数存储不透明对象* flagp中由参数除外的异常标志的状态表示。

feraiseexcept()函数引发由excepts中的位表示的受支持的异常。

fesetexceptflag()函数将用excepts表示的异常的完整状态设置为值* flagp。该值必须通过fegetexceptflag()的更早调用获得,并且最后一个参数包含excepts中的所有位。

fetestexcept()函数返回一个单词,其中设置了在参数except中设置的位,并且当前设置了相应的异常。

Rounding mode

舍入模式确定当不能以有效位数精确表示结果时如何处理浮点运算的结果。可以提供各种舍入模式:舍入到最接近(默认值),舍入(朝正无穷大),舍入(朝负无穷大)和朝零舍入。

当实现支持获取和设置相应的舍入方向时,将定义每个宏FE_TONEARESTFE_UPWARD,FE_DOWNWARD和FE_TOWARDZERO。

fegetround()函数返回与当前舍入模式相对应的宏。

fesetround()函数根据其参数设置舍入模式,并在成功时返回零。

C99和POSIX.1-2008指定在中定义的标识符FLT_ROUNDS,该标识符指示实现定义的舍入行为,用于浮点加法。该标识符具有以下值之一:

-1
舍入模式是不确定的。
0
舍入为0。
1
四舍五入是朝着最近的数字。
2
取整朝着正无穷大。
3
舍入朝向负无穷大。

其他值表示与机器相关的非标准舍入模式。

FLT_ROUNDS的值应反映由fesetround()设置的当前舍入模式(但请参见BUGS)。

Floating-point environment

整个浮点环境,包括控制模式和状态标志,都可以作为fenv_t类型的一个不透明对象来处理。默认环境用FE_DFL_ENV表示(类型const fenv_t *)。这是程序启动时的环境设置,由ISO C定义为具有最接近的舍入,清除的所有异常以及不间断(继续异常)模式的环境。

fegetenv()函数将当前浮点环境保存在对象* envp中。

feholdexcept()函数执行相同的操作,然后清除所有异常标志,并设置不间断(继续执行异常)模式(如果有)。成功时返回零。

fesetenv()函数从对象* envp恢复浮点环境。必须知道该对象有效,例如,调用fegetenv()或feholdexcept()或等于FE_DFL_ENV的结果。此调用不会引发异常。

feupdateenv()函数将安装由对象* envp表示的浮点环境,但不会清除当前引发的异常。调用此函数后,引发的异常将是先前与* envp中设置的那些按位或。和以前一样,必须知道对象* envp是有效的。

名称

feclearexcept,fegetexceptflag,feraiseexcept,fesetexceptflag,fetestexcept,fegetenv,fegetround,feholdexcept,fesetround,fesetenv,feupdateenv,feenableexcept,fediableableexcept,fegetexcept-浮点舍入和异常处理

属性

有关本节中使用的术语的说明,请参见attribute(7)。

InterfaceAttributeValue
feclearexcept(),fegetexceptflag(),feraiseexcept(),fesetexceptflag(),fetestexcept(),fegetround(),fesetround(),fegetenv(),feholdexcept(),fesetenv(),feupdateenv(),feenableexcept(),fedisableexcept(),fegetexcept()Thread safetyMT-Safe

备注

Glibc notes

如果可能,GNU C库定义一个宏FE_NOMASK_ENV,该宏表示引发每个异常都会导致陷阱的环境。您可以使用#ifdef测试此宏。仅在定义_GNU_SOURCE时定义。 C99标准没有定义一种方法来设置浮点掩码中的各个位,例如,以捕获特定标志。从2.2版开始,glibc支持功能feenableexcept()和fedisableexcept()来设置单个浮点陷阱,并支持fegetexcept()来查询状态。

#define _GNU_SOURCE         /* See feature_test_macros(7) */
#include <fenv.h>

int feenableexcept(int excepts);
int fedisableexcept(int excepts);
int fegetexcept(void);

feenableexcept()和fedisableexcept()函数启用(禁用)陷阱所代表的每个异常的陷阱,并在成功时返回先前启用的异常集,否则返回-1。 fegetexcept()函数返回所有当前启用的异常的集合。

遵循规范

IEC 60559(IEC 559:1989),ANSI / IEEE 854,C99,POSIX.1-2001。

BUGS

C99指定FLT_ROUNDS的值应反映由fesetround()设置的当前舍入模式的更改。当前,这不会发生:FLT_ROUNDS始终具有值1。

出版信息

这个页面是Linux手册页项目5.08版的一部分。有关项目的说明、有关报告错误的信息以及此页面的最新版本,请访问https://www.kernel.org/doc/man-pages/

版本

这些功能首先出现在2.1版的glibc中。

另外参见

math_error(7)

返回值

这些函数成功返回零,如果发生错误则返回非零。

FENV - Linux手册页

Linux程序员手册 第3部分
更新日期: 2017-09-15

语法

#include <fenv.h>

int feclearexcept(int excepts);
int fegetexceptflag(fexcept_t *flagp, int excepts);
int feraiseexcept(int excepts);
int fesetexceptflag(const fexcept_t *flagp, int excepts);
int fetestexcept(int excepts);

int fegetround(void);
int fesetround(int rounding_mode);

int fegetenv(fenv_t *envp);
int feholdexcept(fenv_t *envp);
int fesetenv(const fenv_t *envp);
int feupdateenv(const fenv_t *envp);

与-lm链接。

日期:2019-08-20 18:00:16 来源:oir作者:oir