各表及注释 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。