fp_clr_flag , fp_set_flag , fp_read_flag 或 fp_swap_flag 子例程
用途
允许对浮点异常标志执行操作。
库
标准 C 库 (libc.a)
语法
#include <float.h>
#include <fpxcp.h> 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)