Sun Studio 12:Fortran 库参考

1.4.26 ieee_flags、ieee_handler 和 sigfpe:IEEE 算术

这些子程序提供了在 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 可为您设置这些陷阱-启用-掩码位。

modeexception 接受的字符关键字取决于 action 值。

表 1–6 ieee_flags( action , mode , in , out) 参数和操作

action = 'clearall'

modeinout 未使用;返回 0

action = 'clear'

清除 modein

out 未使用;返回 0

mode = 'direction'

 

mode = 'exception'

in = 'inexact'

'division'

'underflow'

'overflow'

'invalid'

'all'

'common'

action = 'set'

设置浮点 modein

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_DEFAULTSIGFPE_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(该值视平台而定)。类似的编码可检测异常,例如 invalidinexact

示例 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

addressfunction hand 的声明更改为 INTEGER*8,以便示例 5 可以在 64 位 SPARC 环境中使用 (-m64)。

请参见《数值计算指南》。另请参见:floatingpoint(3)、signal(3)、sigfpe(3)、floatingpoint(3F)、ieee_flags(3M) 和 ieee_handler(3M)。

1.4.26.1 floatingpoint.h:Fortran IEEE 定义

头文件 floatingpoint.h 定义了根据 ANSI/IEEE 标准 754-1985 实现标准浮点所使用的常量和类型。

在 Fortran 95 源程序中包含该文件的方式如下所示:


#include "floatingpoint.h"

如果要使用该 include 文件,需在进行 Fortran 编译之前进行预处理。如果引用该 include 文件的源文件的扩展名为 .F.F90.F95,则会自动预处理该文件。

IEEE 舍入模式:

fp_direction_type

IEEE 舍入方向模式的类型。枚举顺序随硬件的不同而异。 

SIGFPE 处理:

sigfpe_code_type

SIGFPE 代码的类型。

sigfpe_handler_type

处理特定的 SIGFPE 代码时调用的用户自定义 SIGFPE 异常处理程序的类型。

SIGFPE_DEFAULT

表示缺省 SIGFPE 异常处理的宏:得到缺省结果时,IEEE 异常继续出现;如果是其他 SIGFPE 代码,IEEE 异常将中止。

SIGFPE_IGNORE

表示另外一种可用的 SIGFPE 异常处理的宏,即忽略异常并继续执行。

SIGFPE_ABORT

表示另外一种可用的 SIGFPE 异常处理的宏,即中止核心转储。

IEEE 异常处理:

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)。