这些子程序提供了在 Fortran 程序中充分利用 ANSI/IEEE 标准 754-1985 算术所需的模式和状态。它们与函数 ieee_flags(3M)、ieee_handler(3M) 和 sigfpe(3) 一一对应。
表 1–5 IEEE 算术支持例程
ieeer = ieee_flags( action,mode,in,out ) ieeer = ieee_handler(action,exception,hdl ) ieeer = sigfpe( code, hdl ) |
||
action |
字符 |
输入 |
code |
sigfpe_code_type |
输入 |
mode |
字符 |
输入 |
in |
字符 |
输入 |
exception |
字符 |
输入 |
hdl |
sigfpe_handler_type |
输入 |
out |
字符 |
输出 |
返回值 |
INTEGER*4 |
输出 |
有关如何有策略地使用这些函数的详细信息,请参见 Sun 的《数值计算指南》。
如果使用 sigfpe,必须在浮点状态寄存器中设置对应的陷阱-启用-掩码位。SPARC 体系结构手册中介绍了详细信息。libm 函数 ieee_handler 可为您设置这些陷阱-启用-掩码位。
mode 和 exception 接受的字符关键字取决于 action 值。
表 1–6 ieee_flags( action , mode , in , out) 参数和操作
action = 'clearall' |
mode、in 和 out 未使用;返回 0 |
|
action = 'clear' 清除 mode,in、 out 未使用;返回 0 |
mode = 'direction' | |
mode = 'exception' |
in = 'inexact' 或 'division' 或 'underflow' 或 'overflow' 或 'invalid' 或 'all' 或 'common' |
|
action = 'set' 设置浮点 mode,in、 out 未使用;返回 0 |
mode = 'direction' |
in = 'nearest' 或 'tozero' 或 'positive' 或 'negative' |
mode = 'exception' |
in = 'inexact' 或 'division' 或 'underflow' 或 'overflow' 或 'invalid' 或 'all' 或 'common' |
|
action = 'get' 测试 mode 设置 in 和 out 可为空白或要测试的其中一个设置,返回的当前设置取决于 mode,也可为 'not available'。如果 mode = 'exception',该函数返回 0 或当前异常标志。 |
mode ='direction' |
out = 'nearest' 或 'tozero' 或 'positive' 或 'negative' |
mode ='exception' |
out = 'inexact' 或 'division' 或 'underflow' 或 'overflow' 或 'invalid' 或 'all' 或 'common' |
表 1–7 ieee_handler( action , in , out) 参数
action = 'clear' 清除 in 的用户异常处理;out 未使用 |
in = 'inexact' 或 'division' 或 'underflow' 或 'overflow' 或 'invalid' 或 'all' 或 'common' |
action = 'set' 设置 in 的用户处理异常;out 是处理程序例程的地址,或者是 floating point.h 中定义的 SIGFPE_DEFAULT、SIGFPE_ABORT 或 SIGFPE_IGNORE |
in = 'inexact' 或 'division' 或 'underflow' 或 'overflow' 或 'invalid' 或 'all' 或 'common' |
示例 1:将舍入方向设置为向零舍入,除非硬件不支持要求的舍入模式:
INTEGER*4 ieeer character*1 mode, out, in ieeer = ieee_flags( ’set’, ’direction’, ’tozero’, out ) |
示例 2:将舍入方向清理为缺省方向(向最近的值舍入):
character*1 out, in ieeer = ieee_flags(’clear’,’direction’, in, out ) |
示例 3:清除所有由于产生异常而出现的位:
character*18 out ieeer = ieee_flags( ’clear’, ’exception’, ’all’, out ) |
示例 4:按如下所示检测溢出异常:
character*18 out ieeer = ieee_flags( ’get’, ’exception’, ’overflow’, out ) if (out .eq. ’overflow’ ) stop ’overflow’ |
上述代码将 out 设置为 overflow 并将 ieeer 设置为 25(该值视平台而定)。类似的编码可检测异常,例如 invalid 或 inexact。
示例 5:hand1.f,编写并使用信号处理程序:
external hand real r / 14.2 /, s / 0.0 / i = ieee_handler( ’set’, ’division’, hand ) t = r/s end INTEGER*4 function hand ( sig, sip, uap ) INTEGER*4 sig, address structure /fault/ INTEGER*4 address end structure structure /siginfo/ INTEGER*4 si_signo INTEGER*4 si_code INTEGER*4 si_errno record /fault/ fault end structure record /siginfo/ sip address = sip.fault.address write (*,10) address 10 format(’Exception at hex address ’, z8 ) end |
将 address 和 function hand 的声明更改为 INTEGER*8,以便示例 5 可以在 64 位 SPARC 环境中使用 (-m64)。
请参见《数值计算指南》。另请参见:floatingpoint(3)、signal(3)、sigfpe(3)、floatingpoint(3F)、ieee_flags(3M) 和 ieee_handler(3M)。
头文件 floatingpoint.h 定义了根据 ANSI/IEEE 标准 754-1985 实现标准浮点所使用的常量和类型。
在 Fortran 95 源程序中包含该文件的方式如下所示:
#include "floatingpoint.h" |
如果要使用该 include 文件,需在进行 Fortran 编译之前进行预处理。如果引用该 include 文件的源文件的扩展名为 .F、.F90 或 .F95,则会自动预处理该文件。
fp_direction_type |
IEEE 舍入方向模式的类型。枚举顺序随硬件的不同而异。 |
sigfpe_code_type |
SIGFPE 代码的类型。 |
sigfpe_handler_type |
处理特定的 SIGFPE 代码时调用的用户自定义 SIGFPE 异常处理程序的类型。 |
SIGFPE_DEFAULT |
表示缺省 SIGFPE 异常处理的宏:得到缺省结果时,IEEE 异常继续出现;如果是其他 SIGFPE 代码,IEEE 异常将中止。 |
SIGFPE_IGNORE |
表示另外一种可用的 SIGFPE 异常处理的宏,即忽略异常并继续执行。 |
SIGFPE_ABORT |
表示另外一种可用的 SIGFPE 异常处理的宏,即中止核心转储。 |
N_IEEE_EXCEPTION |
不相同的 IEEE 浮点异常数。 |
fp_exception_type |
N_IEEE_EXCEPTION 异常的类型。每个异常都指定有一个位编号。 |
fp_exception_field_type |
专门用于至少容纳与按 fp_exception_type 列入的 IEEE 异常对应的 N_IEEE_EXCEPTION 位的类型。因此,fp_inexact 对应于最低有效位,fp_invalid 对应于第五个最低有效位。有些操作可以设置多个异常。 |
IEEE 分类:
fp_class_type |
IEEE 浮点值和符号分类的列表。 |
请参见《数值计算指南》。另请参见 ieee_environment(3F)。