fp_clr_flag , fp_set_flag , fp_read_flag 或 fp_swap_flag 子例程

用途

允许对浮点异常标志执行操作。

标准 C 库 (libc.a)

语法

#include <float.h>
#include <fpxcp.h>
void fp_clr_flag( Mask)
fpflag_t Mask;
void fp_set_flag(Mask)
fpflag_t Mask;
fpflag_t fp_read_flag( )
fpflag_t fp_swap_flag(Mask)
fpflag_t Mask;

描述

这些子例程有助于确定发生异常的时间以及异常类型。 这些子例程可以显式地围绕可能导致浮点异常的代码块进行调用。

根据 用于二元浮点算术的 IEEE 标准,当在浮点运算中检测到以下类型的浮点运算时,必须发出信号:

  • 操作无效
  • 除数为零
  • 溢出
  • 下溢
  • 不精确

当无法表示结果时,将发生无效操作 (0 ,对小于 0 的数字执行 sqrt 操作)。

用于二元浮点算术的 IEEE 标准 声明: " 对于每种类型的异常,实现都应提供一个状态标志,当未发生相应的陷阱时,将在发生相应异常时设置该状态标志。 只有在用户请求时才会重置此值。 用户应该能够单独测试和更改状态标志,并且还应该能够同时保存和恢复所有五个标志。"

浮点运算可以在浮点异常状态中设置标志,但不能清除这些标志。 用户可以使用显式软件操作 (例如 fp_swap_flag (0) 子例程) 来清除浮点异常状态中的标志。

fpxcp.h 文件为指示浮点异常状态的标志定义以下名称:

描述
FP_INVALID 操作摘要无效
FP_OVERFLOW 溢出
FP_UNDERFLOW 下溢
FP_DIV_BY_ZERO 除以 0
FP_INEXACT 不精确结果

除了这些标志之外,操作系统还支持有关无效操作异常的原因的更多信息。 以下标志还指示浮点异常状态,并在 fpxcp.h 文件中定义。 每种异常类型的标志号各不相同,但所有端口的助记符都相同。 对于符合 IEEE 浮点异常标准,以下无效操作详细信息标志是不需要的:

描述
FP_INV_SNAN 发信号 NaN
FP_INV_ISI INF-INF
FP_INV_IDI INF/INF
FP_INV_ZDZ 0 / 0
FP_INV_IMZ INF x 0
FP_INV_CMP 无序比较
FP_INV_SQRT 负数的平方根 (平方根)
FP_INV_CVI 转换为整数错误
FP_INV_VXSOFT 软件请求

参数

描述
掩码 一种 32 位模式,用于标识浮点异常标志。

返回值

fp_clr_flag 子例程将 掩码 参数定义的异常状态标志复位为 0 (false)。 处于异常状态的其余标志未更改。

fp_set_flag 子例程将 掩码 参数定义的异常状态标志设置为 1 (true)。 处于异常状态的其余标志未更改。

fp_read_flag 子例程将返回当前浮点异常状态。 可以使用上面的标志定义来测试返回的异常状态中的标志。 您可以测试各个标志或标志集。

fp_swap_flag 子例程将 掩码 参数写入浮点状态中,并从写入前返回浮点异常状态。

用户使用 fp_set_flag fp_clr_flag 为各个标志设置或重置多个异常标志 (通过 AND 或 OR 定义)。 例如,以下命令将同时重置溢出标志和不精确标志:

fp_clr_flag (FP_OVERFLOW | FP_INEXACT)