本文只是对http://www.cplusplus.com/reference/cfenv/的浮点环境的简单翻译。
具体可以参考http://blog.csdn.net/zhoudaxia/article/details/4710047
#include <fenv.h>/ #inlcude <cfenv>浮点数环境,对于支持#pragma的编译器,只有在代码前加#pragma STDC_FENV_ACCESS on后才有效。不支持#pragma的编译器,大多直接支持float-point environment的访问。
类型:
fenv_t 是一个结构体typedef struct fenv_t{unsigned long _fe_ctl, _fe_stat;} fenv_t;
表示整个floating-point environment的status flag和control modes。
通过fegetenv或者feholdexcept修改值
fexcept_t typedef unsigned long fexcept_t;异常标志对应fenv_t._fe_stat。
异常宏:
FE_ALL_EXCEPT 以下所有异常的"|"组合
FE_DIVBYZERO 除0异常或者log(0.0)
FE_INEXACT 返回值结果不精确异常(1.0/3.0、sqrt(2.0))
FE_INVALID 函数传参无效异常
FE_UNDERFLOW 对于返回类型来讲返回值太小,以致不能表示结果。
FE_OVERFLOW 对于返回类型来讲返回值太大,以致不能表示结果。
舍入宏:
FE_DOWNWARD 向下舍入,结果小于原数值的最大值
FE_TONEAREST 最近舍入
FE_TOWARDZERO 向0舍入
FE_UPWARD 向上舍入,结果大于原数值的最小值
float-point环境宏:
FE_DFL_ENV 指向fenv_t的指针,表示默认值。
异常函数:
int feclearexcept (int excepts);
// 清空excepts指定的异常,excepts取值为表示异常的宏。成功返回0,失败返回非0值。
int feraiseexcept (int excepts)
// 抛出excepts异常。成功返回0,失败返回非0值。
int fegetexceptflag (fexcept_t* flagp, int excepts);
// 用flagp获取excepts异常的fenv_t._fe_stat。成功返回0,失败返回非0值。
int fesetexceptflag (const fexcept_t* flagp, int excepts);
// 用flagp修改excepts异常的fenv_t._fe_stat
舍入函数:
int fegetround (void);
int fesetround (int rdir); // 成功返回0,失败返回非0值。
// 参考舍入宏
float-point环境函数
int fegetenv (fenv_t* envp);
int fesetenv (const fenv_t* envp)
// envp获取/创建当前float-point environment的_fe_stat和_fe_ctl
int feholdexcept (fenv_t* envp);
/* 将当前浮点数环境保存到ENVP所指对象中,清除异常标志,然后安装一个不停止的浮点数环境(即
忽略所有浮点数异常) */
int feupdateenv (const fenv_t* envp);
/* 将当前浮点数环境保存到一个临时存储中,然后安装ENVP所指的环境,并根据保存的异常环境
产生异常 */
int fetestexcept (int excepts);
// 返回当前异常集合中包含excepts异常的异常cfenv
浮点数环境,对于支持#pragma的编译器,只有在代码前加#pragma STDC_FENV_ACCESS on后才有效。不支持#pragma的编译器,大多直接支持float-point environment的访问。
类型:
fenv_t 是一个结构体typedef struct fenv_t{unsigned long _fe_ctl, _fe_stat;} fenv_t;
表示整个floating-point environment的status flag和control modes。
通过fegetenv或者feholdexcept修改值
fexcept_t typedef unsigned long fexcept_t;异常标志对应fenv_t._fe_stat。
异常宏:
FE_ALL_EXCEPT 以下所有异常的"|"组合
FE_DIVBYZERO 除0异常或者log(0.0)
FE_INEXACT 返回值结果不精确异常(1.0/3.0、sqrt(2.0))
FE_INVALID 函数传参无效异常
FE_UNDERFLOW 对于返回类型来讲返回值太小,以致不能表示结果。
FE_OVERFLOW 对于返回类型来讲返回值太大,以致不能表示结果。
舍入宏:
FE_DOWNWARD 向下舍入,结果小于原数值的最大值
FE_TONEAREST 最近舍入
FE_TOWARDZERO 向0舍入
FE_UPWARD 向上舍入,结果大于原数值的最小值
float-point环境宏:
FE_DFL_ENV 指向fenv_t的指针,表示默认值。
异常函数:
int feclearexcept (int excepts);
// 清空excepts指定的异常,excepts取值为表示异常的宏。成功返回0,失败返回非0值。
int feraiseexcept (int excepts)
// 抛出excepts异常。成功返回0,失败返回非0值。
int fegetexceptflag (fexcept_t* flagp, int excepts);
// 用flagp获取excepts异常的fenv_t._fe_stat。成功返回0,失败返回非0值。
int fesetexceptflag (const fexcept_t* flagp, int excepts);
// 用flagp修改excepts异常的fenv_t._fe_stat
舍入函数:
int fegetround (void);
int fesetround (int rdir); // 成功返回0,失败返回非0值。
// 参考舍入宏
float-point环境函数
int fegetenv (fenv_t* envp);
int fesetenv (const fenv_t* envp)
// envp获取/创建当前float-point environment的_fe_stat和_fe_ctl
int feholdexcept (fenv_t* envp);
/* 将当前浮点数环境保存到ENVP所指对象中,清除异常标志,然后安装一个不停止的浮点数环境(即
忽略所有浮点数异常) */
int feupdateenv (const fenv_t* envp);
/* 将当前浮点数环境保存到一个临时存储中,然后安装ENVP所指的环境,并根据保存的异常环境
产生异常 */
int fetestexcept (int excepts);
// 返回当前异常集合中包含excepts异常的异常