Oracle® Solaris Studio 12.4:数值计算指南

退出打印视图

更新时间: 2015 年 1 月
 
 

4.3 检测异常

正如 IEEE 标准所要求的那样,基于 SPARC 和 x86 的系统上的浮点环境提供了用来记录所出现的浮点异常的状态标志。程序可通过测试这些标志来确定已发生了哪些异常。这些标志还可以被显式设置和清除。ieee_flags 函数提供一种访问这些标志的方法。在用 C 或 C++ 编写的程序中,C99 浮点环境函数提供另一种方法。

在基于 SPARC 的系统上,每种异常都有两个与之相关的标志:当前和已发生。 当前异常标志总是指出由上一个完成执行的浮点指令引发的异常。这些标志还累积(即“或”)到已发生异常标志中,从而记录自该程序开始执行或者自该程序上次清除已发生标志以来已经发生的所有未捕获异常。当浮点指令导致捕获的异常时,会设置与导致该陷阱的异常相对应的当前异常标志,但是不会更改已发生标志。当前异常标志和已发生异常标志都包含在浮点状态寄存器 %fsr 中。

在基于 x86 的系统上,浮点状态字 (SW) 为已发生异常以及浮点栈的状态提供标志。在基于 x86 的支持 SSE2 指令的系统上,MXCSR 寄存器包含记录由这些指令引发的已发生异常的标志。