以下备注适用于本章中的所有内函数表。
缩写 DOUBLE 代表 DOUBLE PRECISION。
采用 INTEGER 参数的内函数接受 INTEGER*2、INTEGER*4 或 INTEGER*8。
采用 INTEGER 参数的 INTEGER 内函数返回下面确定的 INTEGER 类型的值。请注意,-xtypemap 选项可能会更改实际参数的缺省大小:
mod sign dim max min and iand or ior xor ieor-返回值的大小是最大参数大小。
abs ishft lshift rshift lrshft ibset ivclr ishftc ibits-返回值的大小是第一个参数的大小。
int epbase epprec-返回值的大小是缺省 INTEGER 的大小。
ephuge-返回值的大小是缺省 INTEGER 的大小或参数的大小,以两者中最大的值为准。
更改缺省数据大小的选项也改变了一些内函数的使用方式。例如,在 -dbl 生效时,调用带 DOUBLE COMPLEX 参数的 ZCOS 会自动变为调用 CQCOS,这是因为参数已经提升到 COMPLEX*32。以下函数也具有该功能:
aimag alog amod cabs ccbrt ccos cdabs cdcbrt cdcos cdexp cdlog cdsin cdsqrt cexp clog csin csqrt dabs dacos dacosd dasin dasind datan datand dcbrt dconjg dcos dcosd dcosh ddim derf derfc dexp dimag dint dlog dmod dnint dprod dsign dsin dsind dsinh dsqrt dtan dtand dtanh idnint iidnnt jidnnt zabs zcbrt zcos zexp zlog zsin zsqrt
以下函数允许使用整数参数或任意大小的逻辑类型:
and iand ieor iiand iieor iior inot ior jiand jieor jior jnot lrshft lshift not or rshift xor
所示能够返回缺省 REAL、DOUBLE PRECISION、COMPLEX 或 DOUBLE COMPLEX 值的内函数将根据某些编译选项返回主要的类型。例如,如果使用 - xtypemap=real:64,double:64 选项进行编译:
调用 REAL 函数返回 REAL*8
调用 DOUBLE PRECISION 函数返回 REAL*8
调用 COMPLEX 函数返回 COMPLEX*16
调用 DOUBLE COMPLEX 函数返回 COMPLEX*16
更改缺省数据类型的数据大小的其他选项有 – r8 和 – dbl,它们也会从 DOUBLE 提升到 QUAD。与这些早期编译器选项相比,– xtypemap= 选项更加灵活,因此优先使用该选项。
具有通用名称的函数返回值的类型与参数相同-类型转换函数、最近的整数函数、复数参数的绝对值以及其他函数除外。如果有多个参数,它们的类型必须相同。
如果函数名用作实际参数,则它必须是专用名称。
如果函数名用作伪参数,则它不能识别子程序中的内函数,并且根据与变量和数组相同的规则确定其数据类型。
各表及注释 1 至 12 以《ANSI X3.9-1978 Programming Language FORTRAN》中的“Table of Intrinsic Functions”为基础,并增加了 Fortran 扩展。
(1) INT
如果 A 为整数类型,则 INT(A) 为 A。
如果 A 为实数或双精度类型:
如果 |A| < 1,则 INT(A) 为 0;如果 |A| ≥ 1,则 INT(A) 是最大的整数,但是不超过 A 的幅度,并且它的符号与 A 的符号相同。(这样的数学整数值可能太大,无法符合计算机整数类型的要求。)
如果 A 为复数或双复数类型,则以上规则适用于 A 的实部。
如果 A 为实数类型,则 IFIX(A) 与 INT(A) 相同。
(2) REAL
如果 A 为实数类型,则 REAL(A) 为 A。
如果 A 为整数或双精度类型,则 REAL(A) 的 A 有效部分的精度与实数据具有的精度差不多。
如果 A 为复数类型,则 REAL(A) 为 A 的实部。
如果 A 为双复数类型,则 REAL(A) 的 A 实部中有效部分的精度与实数据具有的精度差不多。
(3) DBLE
如果 A 为双精度类型,则 DBLE(A) 为 A。
如果 A 为整数或实数类型,则 DBLE(A) 的 A 有效部分的精度与双精度数据具有的精度差不多。
如果 A 为复数类型,则 DBLE(A) 的 A 实部中有效部分的精度与双精度数据具有的精度差不多。
如果 A 为 COMPLEX*16 类型,则 DBLE(A) 为 A 的实部。
(3’) QREAL
如果 A 为 REAL*16 类型,则 QREAL(A) 为 A。
如果 A 为整数、实数或双精度类型,则 QREAL(A) 的 A 有效部分的精度与 REAL*16 数据具有的精度差不多。
如果 A 为复数或双复数类型,则 QREAL(A) 的 A 实部中有效部分的精度与 REAL*16 数据具有的精度差不多。
如果 A 为 COMPLEX*16 或 COMPLEX*32 类型,则 QREAL(A) 为 A 的实部。
(4) CMPLX
如果 A 为复数类型,则 CMPLX(A) 为 A。
如果 A 为整数、实数或双精度类型,则 CMPLX(A) 为 REAL(A) + 0i。
如果 A1 和 A2 为整数、实数或双精度类型,则 CMPLX(A1,A2) 为 REAL(A1) + REAL(A2)*i。
如果 A 为双复数类型,则 CMPLX(A) 为 REAL( DBLE(A) ) + i*REAL( DIMAG(A) )。
如果 CMPLX 有两个参数,则它们的类型必须相同,可以是整数、实数或双精度类型。
如果 CMPLX 有一个参数,则它可以是整数、实数、双精度、复数、COMPLEX*16 或 COMPLEX*32 类型。
(4’) DCMPLX
如果 A 为 COMPLEX*16 类型,则 DCMPLX(A) 为 A。
如果 A 为整数、实数或双精度类型,则 DCMPLX(A) 为 DBLE(A) + 0i。
如果 A1 和 A2 为整数、实数或双精度类型,则 DCMPLX(A1,A2) 为 DBLE(A1) + DBLE(A2)*i。
如果 DCMPLX 有两个参数,则它们的类型必须相同,可以是整数、实数或双精度类型。
如果 DCMPLX 有一个参数,则它可以是整数、实数、双精度、复数、COMPLEX*16 或 COMPLEX*32 类型。
(5) ICHAR
ICHAR(A) 为 A 在整理序列中的位置。
第一个位置为 0,最后一个位置为 N-1, 0≤ICHAR(A)≤N-1,其中 N 是整理序列中的字符数,A 属于长度为 1 的字符类型。
CHAR 和 ICHAR 在以下几方面意义相反:
ICHAR(CHAR(I)) = I,适用于 0≤I≤N-1
CHAR(ICHAR(C)) = C,适用于能够在处理器中表示的任何字符 C
(6) COMPLEX
COMPLEX 值表示为一对有序的实数 (ar, ai),其中 ar 为实部,ai 为虚部。
(7) 弧度
所有角度都以弧度表示,除非“内函数”列包含注释“(度数)”。
(8) COMPLEX 函数
COMPLEX 类型的函数的结果是主值。
(8’) CBRT
如果 a 属于 COMPLEX 类型,则 CBRT 生成结果 COMPLEX RT1=(A, B),其中:A ≥ 0.0,而且 -60 度 ≤ arctan (B/A) < + 60 度。
其他两个结果的计算公式可能如下所示:
RT2 = RT1 * (-0.5, square_root (0.75))
RT3 = RT1 * (-0.5, square_root (0.75))
(9) 参数类型
内函数引用中所有参数的类型必须相同。
(10) INDEX
INDEX(X,Y) 是指 X 中开始出现 Y 的位置。也就是说,它是指字符串 X 中第一次出现字符串 Y 的起始位置。
如果 X 中没有 Y,则 INDEX(X,Y) 为 0。
如果 LEN(X) < LEN(Y),则 INDEX(X,Y) 为 0。
INDEX 返回缺省的 INTEGER*4 数据。如果针对 64 位环境进行编译,则当结果溢出 INTEGER*4 数据范围时,编译器将发出警告。要在 64 位环境中使用 INDEX,并且字符串超出 INTEGER*4 限制 (2 GB),必须将 INDEX 函数以及接收结果的变量声明为 INTEGER*8。
(11) LEN
LEN 返回 CHARACTER 参数变量的声明长度。参数的实际值无关紧要。
LEN 返回缺省的 INTEGER*4 数据。如果针对 64 位环境进行编译,则当结果溢出 INTEGER*4 数据范围时,编译器将发出警告。要在 64 位环境中使用 LEN,并且字符串超出 INTEGER*4 限制 (2 GB),必须将 LEN 函数以及接收结果的变量声明为 INTEGER*8。
(12) 词法比较
如果 X=Y 或者在整理序列中 X 位于 Y 之后,则 LGE( X, Y ) 为 true;否则为 false。
如果在整理序列中 X 位于 Y 之后,则 LGT( X, Y ) 为 true;否则为 false。
如果 X=Y 或者在整理序列中 X 位于 Y 之前,则 LLE( X, Y ) 为 true;否则为 false。
如果在整理序列中 X 位于 Y 之前,则 LLT( X, Y ) 为 true;否则为 false。
如果 LGE、LGT、LLE 和 LLT 的操作数长度不同,则会考虑较短的操作数,就好像在右边加上了空白一样。
(13) 位函数
在 VMS Fortran 中还有其他一些按位操作,但是没有实现。
(14) 移位
LSHIFT 将 a1 向左逻辑移动 a2 个位(内联代码)。
LRSHFT 将 a1 向右逻辑移动 a2 个位(内联代码)。
RSHIFT 将 a1 向右算术移动 a2 个位。
ISHFT 将 a1 向左逻辑移动(如果 a2 > 0),或者向右移动(如果 a2 < 0)。
Fortran 中的 LSHIFT 和 RSHIFT 函数相当于 C 语言的 << 和 >> 运算符。与 C 语言中一样,语义取决于硬件。
在移位计数超出范围时,移位函数的行为与硬件有关,并且一般无法预见。在该版本中,移位计数大于 31 将导致出现与硬件有关的行为。
(15) 环境查询
只有参数的类型有意义。
(16) 厄普西隆
Epsilon 是最小的 e,因此 1.0 + e ≠ 1.0。
(17) LOC、MALLOC 和 FREE
LOC 函数返回变量或外部过程的地址。函数调用 MALLOC( n ) 会分配至少为 n 个字节的块,并且返回该块的地址。
在 32 位环境中,LOC 返回缺省的 INTEGER*4,在 64 位环境中,LOC 返回缺省的 INTEGER*8。
MALLOC 是一种库函数,不是 FORTRAN 77 中的内函数。在 32 位环境中也返回缺省的 INTEGER*4,在 64 位环境中返回缺省的 INTEGER*8。但是,在针对 64 位环境进行编译时,必须将 MALLOC 显式声明为 INTEGER*8。
在 64 位环境中,LOC 或 MALLOC 返回的值应当存储在类型为 POINTER、INTEGER*4 或 INTEGER*8 的变量中。FREE 的参数必须是上次调用 MALLOC 时返回的值,因此它的数据类型应为 POINTER、INTEGER*4 或 INTEGER*8。
MALLOC64 始终采用 INTEGER*8 参数(以字节数表示的内存请求大小),并且始终返回 INTEGER*8 值。当编译必须在 32 位环境和 64 位环境中运行的程序时,请使用该例程,而非 MALLOC。必须将接收变量声明为 POINTER 或 INTEGER*8。
(18) SIZEOF
SIZEOF 内函数不能应用于假定大小的数组、超长的字符或者子例程调用或名称。SIZEOF 返回缺省的 INTEGER*4 数据。如果针对 64 位环境进行编译,则当结果溢出 INTEGER*4 数据范围时,编译器将发出警告。要在 64 位环境中使用 SIZEOF,并且数组超出 INTEGER*4 限制 (2 GB),必须将 SIZEOF 函数以及接收结果的变量声明为 INTEGER*8。