-qflttrap (-ftrapping-math)
适用的调用
| 选项 | xlc (编译 C) | xlC (编译 C++) | xlclang(编译 C) | xlclang++(编译 C++) |
|---|---|---|---|---|
| -qflttrap | ✓ | ✓ | ✓ | ✓ |
| -ftrapping-math | ✓ | ✓ |
注: 此表中仅列出典型调用。 对于所有基本调用及其等效特殊调用,您可以参阅 编译器调用的完整列表 。
类别
等效编译指示
| xlc/xlC 和其他遗留的调用命令 | xlclang/xlclang + + 调用命令 |
|---|---|
| #pragma 选项 [no] flttrap | 无 |
用途
确定在运行时要检测哪些类型的浮点异常。
当发生相应的异常时,程序接收到 SIGTRAP 信号。
语法
缺省值
-fnotrapping-math 或 -qnoflttrap
指定不带子选项的 -qflttrap 选项等同于 -qflttrap=overflow:underflow:zerodivide:invalid:inexact
参数
注: 只能使用 -qflttrap 指定以下子选项。
- 启用, en
- 当发生指定的异常 (overflow, underflow, zero划, invalid或 inact) 时, 插入陷阱 。 如果要在不修改源代码的情况下打开异常捕获,则必须指定此子选项。 如果发生任何指定的异常,那么将向具有该异常的精确位置的进程发送 SIGTRAP 或 SIGFPE 信号。 如果 imprecise 生效,那么陷阱将不会准确报告发生异常的位置。
- 不精确
- 启用对指定异常的不精确检测。 编译器在代码块之后并在
main程序返回之前生成指令,以检查是否发生了任何指定的异常 (overflow, underflow, zero分岐, 无效或 不精确)。 如果发生异常,那么将在浮点状态和控制寄存器中设置异常状态标志,但未确定异常的确切位置。 由于在每次浮点操作和函数调用后都不会生成指示信息以检查异常,因此此子选项可使性能略有提高。 - 不精确, inex
- 启用浮点不精确操作的检测。 如果未同时指定 imprecise ,那么编译器将在每个浮点操作和函数调用后生成指令,以检查是否发生了不精确的操作异常。 如果发生浮点不精确操作,那么将在浮点状态和控制寄存器 (FPSCR) 中设置不精确操作异常状态标志。
- 无效, inv
- 启用浮点无效操作的检测。 如果未同时指定 imprecise ,那么编译器将在每个浮点操作和函数调用后生成指令,以检查是否发生了无效操作异常。 如果发生浮点无效操作,那么将在 FPSCR 中设置无效操作异常状态标志。
- NANQ
- 生成代码以检测每个浮点运算 (包括赋值) 前后的 "不是数字停顿" (NaNQ) 和 "不是数字信号" (NaNS) 异常,并在每次调用函数后返回浮点结果以捕获 (如果值为 NaN)。 无论是否指定了 enable 子选项,都将生成捕获代码。
- 溢出, ov
- 允许检测浮点溢出。如果未同时指定 imprecise ,那么编译器将在每次浮点操作和函数调用后生成指令,以检查是否发生了溢出异常。 如果发生浮点溢出,那么将在 FPSCR 中设置溢出异常状态标志。
- underflow和 und
- 支持检测浮点下流。 如果未同时指定 imprecise ,那么编译器将在每个浮点运算和函数调用后生成指令,以检查是否发生了下流异常。 如果发生浮点下流,那么会在 FPSCR 中设置下流异常状态标志。
- 零除, 零
- 支持检测浮点除数为零。 如果未同时指定 imprecise ,那么编译器将在每个浮点运算和函数调用后生成指令,以检查是否发生了除零异常。 如果发生浮点除零,那么将在 FPSCR 中设置除零异常状态标志。
使用量
硬件将检测到异常,但不会启用陷阱。
建议您在使用 -qflttrap编译 main 程序时使用 enable 子选项。 这将确保编译器将生成代码以自动启用浮点异常捕获,而无需在代码中包含对相应浮点异常库函数的调用。
如果你多次指定 -qflttrap,无论是否带有子选项,都将忽略不带子选项的 -qflttrap。
在与 IPA 链接期间,会识别 -qflttrap 选项。 在链接步骤指定选项会覆盖编译时设置。
如果您的程序包含信号 NaNs, ,则应使用 -qfloat=nans 选项和 -qflttrap 来捕获任何异常。
当 -qflttrap 选项与优化选项一起指定时,编译器将显示以下示例中所说明的行为:
- 使用 -O2:
- 1/0 生成 div0 异常,其结果为无穷大
- 0/0 生成无效操作
- 使用 -O3 或更高版本:
- 1/0 生成 div0 异常,其结果为无穷大
- 0/0 返回零乘以上一个除法的结果。
如果使用 -qflttrap=inv:en 来编译包含 IEEE 无效 SQRT 操作的程序,并且指定了未实现
sqrt 指令集的 -qarch 目标,那么运行该程序时不会出现期望的 SIGTRAP 信号。 可以通过在运行程序之前指定以下命令来解决此问题:export SQRT_EXCEPTION=3.1注: 由于所执行的变换以及对某些向量指令的异常处理支持,使用 -qsimd=auto 可能会更改捕获异常的位置,甚至会导致编译器无法捕获异常。
预定义的宏
无。
示例
#include <stdio.h>
int main()
{
float x, y, z;
x = 5.0;
y = 0.0;
z = x / y;
printf("%f", z);
} 当你使用以下命令编译此程序时,程序会在执行除法时停止。
xlc -qflttrap=zerodivide:enable divide_by_zero.czerodivide 子选项标识要防范的异常类型。 发生异常时, enable 子选项会导致生成 SIGTRAP 信号。
