本章列出了FORTRAN 77 f95 接受的一系列内函数,旨在帮助将传统的 FORTRAN 77 程序迁移至 Fortran 95。
在 f95 中,本章列出的所有 FORTRAN 77 和 VMS 函数以及前一章列出的所有 Fortran 95 函数都识别为内函数。为了帮助从传统的 FORTRAN 77 程序迁移至 f95,使用 -f77=intrinsics 进行编译会让编译器只将 FORTRAN 77 和 VMS 函数识别为内函数,但 Fortran 95 函数不会识别为内函数。
属于 Sun 扩展的 ANSI FORTRAN 77 标准的内函数标有 ¤ 符号。使用非标准内函数和库函数的程序可能无法移植到其他平台。
内函数在接受多种数据类型的参数时,有通用名称和专用名称。通常,通用名称返回与参数具有相同数据类型的值。但也有一些例外,如类型转换函数(表 3–2)和查询函数(表 3–7)。这些函数也可以通过函数的某个专用名称进行调用,以便处理专用参数数据类型。
对于处理多个数据项的函数(例如 sign(a1,a2)),所有数据参数的类型必须相同。
下表按以下几方面列出 FORTRAN 77 内函数:
内函数-描述函数的作用
定义-数学定义
参数数量-函数接受的参数的数量
通用名称-函数的通用名称
专用名称 -函数的专用名称
参数类型-与每个专用名称关联的数据类型
函数类型-针对专用参数数据类型返回的数据类型
编译器选项 -xtypemap 会更改变量的缺省大小,并且对内在引用产生影响。请参见3.4 备注以及《Fortran 用户指南》中有关缺省大小和对齐方式的介绍。
本节详细介绍算术函数、类型转换函数、三角函数以及其他函数。“a”代表函数的单个参数,“a1”和“a2”代表两个参数函数的第一个参数和第二个参数,“ar”和“ai”代表函数的复数参数的实部和虚部。
内函数 |
定义 |
参数 数量 |
通用 名称 |
专用 名称 |
参数 类型 |
函数类型 |
---|---|---|---|---|---|---|
绝对值 请参见注释 (6)。 |
|a| = (ar2+ai2)1/2 |
1 |
ABS |
IABS ABS DABS CABS QABS ¤ ZABS ¤ CDABS ¤ CQABS ¤ |
INTEGER REAL DOUBLE COMPLEX REAL*16 DOUBLE COMPLEX DOUBLE COMPLEX COMPLEX*32 |
INTEGER REAL DOUBLE REAL REAL*16 DOUBLE DOUBLE REAL*16 |
截断 请参见注释 (1)。 |
int(a) |
1 |
AINT |
AINT DINT QINT ¤ |
REAL DOUBLE REAL*16 |
REAL DOUBLE REAL*16 |
最近的整数 |
如果 a ≥ 0,则为 int(a+.5) 如果 a < 0,则为 int(a-.5) |
1 |
ANINT |
ANINT DNINT QNINT ¤ |
REAL DOUBLE REAL*16 |
REAL DOUBLE REAL*16 |
最近的整数 |
如果 a ≥ 0,则为 int(a+.5) 如果 a < 0,则为 int(a-.5) |
1 |
NINT |
NINT IDNINT IQNINT ¤ |
REAL DOUBLE REAL*16 |
INTEGER INTEGER INTEGER |
余数 请参见注释 (1)。 |
a1-int(a1/a2)*a2 |
2 |
MOD |
MOD AMOD DMOD QMOD ¤ |
INTEGER REAL DOUBLE REAL*16 |
INTEGER REAL DOUBLE REAL*16 |
符号传输 |
如果 a2 ≥ 0,则为 |a1| 如果 a2 < 0,则为 -|a1| |
2 |
SIGN |
ISIGN SIGN DSIGN QSIGN ¤ |
INTEGER REAL DOUBLE REAL*16 |
INTEGER REAL DOUBLE REAL*16 |
正偏差 |
如果 a1 > a2,则为 a1-a2 如果 a1≤ a2,则为 0 |
2 |
DIM |
IDIM DIM DDIM QDIM ¤ |
INTEGER REAL DOUBLE REAL*16 |
INTEGER REAL DOUBLE REAL*16 |
两倍和四倍乘积 |
a1 * a2 |
2 |
- |
DPROD QPROD ¤ |
REAL DOUBLE |
DOUBLE REAL*16 |
选择最大的值 |
max(a1, a2, …) |
≥2 |
MAX |
MAX0 AMAX1 DMAX1 QMAX1 ¤ |
INTEGER REAL DOUBLE REAL*16 |
INTEGER REAL DOUBLE REAL*16 |
AMAX0 |
AMAX0 |
INTEGER |
REAL |
|||
MAX1 |
MAX1 |
REAL |
INTEGER |
|||
选择最小的值 |
min(a1, a2, …) |
≥2 |
MIN |
MIN0 AMIN1 DMIN1 QMIN1 ¤ |
INTEGER REAL DOUBLE REAL*16 |
INTEGER REAL DOUBLE REAL*16 |
AMIN0 |
AMIN0 |
INTEGER |
REAL |
|||
MIN1 |
MIN1 |
REAL |
INTEGER |
转换为 |
参数数量 |
通用名称 |
专用 名称 |
参数类型 |
函数类型 |
||
---|---|---|---|---|---|---|---|
INTEGER
|
1 |
INT |
- INT IFIX IDINT - - - IQINT ¤ |
INTEGER REAL REAL DOUBLE COMPLEX COMPLEX*16 COMPLEX*32 REAL*16 |
INTEGER INTEGER INTEGER INTEGER INTEGER INTEGER INTEGER INTEGER |
||
REAL
|
1 |
REAL |
REAL FLOAT - SNGL SNGLQ ¤ - - - FLOATK |
INTEGER INTEGER REAL DOUBLE REAL*16 COMPLEX COMPLEX*16 COMPLEX*32 INTEGER*8 |
REAL REAL REAL REAL REAL REAL REAL REAL REAL*4 |
||
DOUBLE
|
1 |
DBLE |
DBLE DFLOAT DFLOATK DREAL ¤ - - - - - DBLEQ ¤- |
INTEGER INTEGER INTEGER*8 REAL DOUBLE COMPLEX COMPLEX*16 REAL*16 COMPLEX*32REAL*16COMPLEX*32 |
DOUBLE PRECISION DOUBLE PRECISION DOUBLE PRECISION DOUBLE PRECISION DOUBLE PRECISION DOUBLE PRECISION DOUBLE PRECISION DOUBLE PRECISION DOUBLE PRECISIONDOUBLE PRECISION DOUBLE PRECISION |
||
|
1 |
QREAL¤ QEXT ¤ |
QREAL ¤ QFLOAT ¤ - QEXT ¤ QEXTD ¤ - - - - |
INTEGER INTEGER REAL INTEGER DOUBLE REAL*16 COMPLEX COMPLEX*16 COMPLEX*32 |
REAL*16 REAL*16 REAL*16 REAL*16 REAL*16 REAL*16 REAL*16 REAL*16 REAL*16 |
||
|
1 个或 2 个 |
|
- - - - - - - |
INTEGER REAL DOUBLE REAL*16 COMPLEX COMPLEX*16 COMPLEX*32 |
COMPLEX COMPLEX COMPLEX COMPLEX COMPLEX COMPLEX COMPLEX |
||
|
1 个或 2 个 |
|
- - - - - - - |
INTEGER REAL DOUBLE REAL*16 COMPLEX COMPLEX*16 COMPLEX*32 |
DOUBLE COMPLEX DOUBLE COMPLEX DOUBLE COMPLEX DOUBLE COMPLEX DOUBLE COMPLEX DOUBLE COMPLEX DOUBLE COMPLEX |
||
|
1 个或 2 个 |
|
- - - - - - - |
INTEGER REAL DOUBLE REAL*16 COMPLEX COMPLEX*16 COMPLEX*32 |
COMPLEX*32 COMPLEX*32 COMPLEX*32 COMPLEX*32 COMPLEX*32 COMPLEX*32 COMPLEX*32 |
||
|
1 |
|
ICHAR IACHAR ¤ |
CHARACTER |
INTEGER |
||
|
1 |
|
CHAR ACHAR ¤ |
INTEGER |
CHARACTER |
在 ASCII 平台上(包括 Sun 系统):
ACHAR 是 CHAR 的非标准同义词
IACHAR 是 ICHAR 的非标准同义词
在非 ASCII 平台上,ACHAR 和 IACHAR 专门用于提供一种直接处理 ASCII 的方法。
内函数 |
定义 |
参数数量 |
通用名称 |
专用 名称 |
参数类型 |
函数类型 |
---|---|---|---|---|---|---|
正弦 请参见注释 (7)。 |
sin(a) |
1 |
SIN |
SIN DSIN QSIN ¤ CSIN ZSIN ¤ CDSIN ¤ CQSIN ¤ |
REAL DOUBLE REAL*16 COMPLEX DOUBLE COMPLEX DOUBLE COMPLEX COMPLEX*32 |
REAL DOUBLE REAL*16 COMPLEX DOUBLE COMPLEX DOUBLE COMPLEX COMPLEX*32 |
正弦(度数) 请参见注释 (7)。 |
sin(a) |
1 |
SIND ¤ |
SIND ¤ DSIND ¤ QSIND ¤ |
REAL DOUBLE REAL*16 |
REAL DOUBLE REAL*16 |
余弦 请参见注释 (7)。 |
cos(a) |
1 |
COS |
COS DCOS QCOS ¤ CCOS ZCOS ¤ CDCOS ¤ CQCOS ¤ |
REAL DOUBLE REAL*16 COMPLEX DOUBLE COMPLEX DOUBLE COMPLEX COMPLEX*32 |
REAL DOUBLE REAL*16 COMPLEX DOUBLE COMPLEX DOUBLE COMPLEX COMPLEX*32 |
余弦(度数) 请参见注释 (7)。 |
cos(a) |
1 |
COSD ¤ |
COSD ¤ DCOSD ¤ QCOSD ¤ |
REAL DOUBLE REAL*16 |
REAL DOUBLE REAL*16 |
正切 请参见注释 (7)。 |
tan(a) |
1 |
TAN |
TAN DTAN QTAN ¤ |
REAL DOUBLE REAL*16 |
REAL DOUBLE REAL*16 |
正切(度数) 请参见注释 (7)。 |
tan(a) |
1 |
TAND ¤ |
TAND ¤ DTAND ¤ QTAND ¤ |
REAL DOUBLE REAL*16 |
REAL DOUBLE REAL*16 |
反正弦 请参见注释 (7)。 |
arcsin(a) |
1 |
ASIN |
ASIN DASIN QASIN ¤ |
REAL DOUBLE REAL*16 |
REAL DOUBLE REAL*16 |
反正弦(度数) 请参见注释 (7)。 |
arcsin(a) |
1 |
ASIND ¤ |
ASIND ¤ DASIND ¤ QASIND ¤ |
REAL DOUBLE REAL*16 |
REAL DOUBLE REAL*16 |
反余弦 请参见注释 (7)。 |
arccos(a) |
1 |
ACOS |
ACOS DACOS QACOS ¤ |
REAL DOUBLE REAL*16 |
REAL DOUBLE REAL*16 |
反余弦(度数) 请参见注释 (7)。 |
arccos(a) |
1 |
ACOSD ¤ |
ACOSD ¤ DACOSD ¤ QACOSD ¤ |
REAL DOUBLE REAL*16 |
REAL DOUBLE REAL*16 |
反正切 请参见注释 (7)。 |
arctan(a) |
1 |
ATAN |
ATAN DATAN QATAN ¤ |
REAL DOUBLE REAL*16 |
REAL DOUBLE REAL*16 |
arctan (a1/a2) |
2 |
ATAN2 |
ATAN2 DATAN2 QATAN2 ¤ |
REAL DOUBLE REAL*16 |
REAL DOUBLE REAL*16 |
|
反正切(度数) 请参见注释 (7)。 |
arctan(a) |
1 |
ATAND ¤ |
ATAND ¤ DATAND ¤ QATAND ¤ |
REAL DOUBLE REAL*16 |
REAL DOUBLE REAL*16 |
arctan (a1/a2) |
2 |
ATAN2D¤ |
ATAN2D ¤ DATAN2D ¤ QATAN2D ¤ |
REAL DOUBLE REAL*16 |
REAL DOUBLE REAL*16 |
|
双曲正弦 请参见注释 (7)。 |
sinh(a) |
1 |
SINH |
SINH DSINH QSINH ¤ |
REAL DOUBLE REAL*16 |
REAL DOUBLE REAL*16 |
双曲余弦 请参见注释 (7)。 |
cosh(a) |
1 |
COSH |
COSH DCOSH QCOSH ¤ |
REAL DOUBLE REAL*16 |
REAL DOUBLE REAL*16 |
双曲正切 请参见注释 (7)。 |
tanh(a) |
1 |
TANH |
TANH DTANH QTANH ¤ |
REAL DOUBLE REAL*16 |
REAL DOUBLE REAL*16 |
内函数 |
定义 |
参数数量 |
通用名称 |
专用名称 |
参数类型 |
函数类型 |
---|---|---|---|---|---|---|
复数的虚部 请参见注释 (6)。 |
ai |
1 |
IMAG |
AIMAG DIMAG ¤ QIMAG ¤ |
COMPLEX DOUBLE COMPLEX COMPLEX*32 |
REAL DOUBLE REAL*16 |
共轭复数 请参见注释 (6)。 |
(ar, -ai) |
1 |
CONJG |
CONJG DCONJG ¤ QCONJG ¤ |
COMPLEX DOUBLE COMPLEX COMPLEX*32 |
COMPLEX DOUBLE COMPLEX COMPLEX*32 |
平方根 |
a**(1/2) |
1 |
SQRT |
SQRT DSQRT QSQRT ¤ CSQRT ZSQRT ¤ CDSQRT ¤ CQSQRT ¤ |
REAL DOUBLE REAL*16 COMPLEX DOUBLE COMPLEX DOUBLE COMPLEX COMPLEX*32 |
REAL DOUBLE REAL*16 COMPLEX DOUBLE COMPLEX DOUBLE COMPLEX COMPLEX*32 |
立方根 请参见注释 (8’)。 |
a**(1/3) |
1 |
CBRT |
CBRT ¤ DCBRT ¤ QCBRT ¤ CCBRT ¤ ZCBRT ¤ CDCBRT ¤ CQCBRT ¤ |
REAL DOUBLE REAL*16 COMPLEX DOUBLE COMPLEX DOUBLE COMPLEX COMPLEX*32 |
REAL DOUBLE REAL*16 COMPLEX DOUBLE COMPLEX DOUBLE COMPLEX COMPLEX*32 |
指数 |
e**a |
1 |
EXP |
EXP DEXP QEXP ¤ CEXP ZEXP ¤ CDEXP ¤ CQEXP ¤ |
REAL DOUBLE REAL*16 COMPLEX DOUBLE COMPLEX DOUBLE COMPLEX COMPLEX*32 |
REAL DOUBLE REAL*16 COMPLEX DOUBLE COMPLEX DOUBLE COMPLEX COMPLEX*32 |
自然对数 |
log(a) |
1 |
LOG |
ALOG DLOG QLOG ¤ CLOG ZLOG ¤ CDLOG ¤ CQLOG ¤ |
REAL DOUBLE REAL*16 COMPLEX DOUBLE COMPLEX DOUBLE COMPLEX COMPLEX*32 |
REAL DOUBLE REAL*16 COMPLEX DOUBLE COMPLEX DOUBLE COMPLEX COMPLEX*32 |
常用对数 |
log10(a) |
1 |
LOG10 |
ALOG10 DLOG10 QLOG10 ¤ |
REAL DOUBLE REAL*16 |
REAL DOUBLE REAL*16 |
误差函数 (请参见下面的注释) |
erf(a) |
1 |
ERF |
ERF ¤ DERF ¤ |
REAL DOUBLE |
REAL DOUBLE |
误差函数 |
1.0 - erf(a) |
1 |
ERFC |
ERFC ¤ DERFC ¤ |
REAL DOUBLE |
REAL DOUBLE |
误差函数:exp(-t*t) dt 从 0 到 a 的 2/sqrt(pi) x 整数
内函数 |
定义 |
参数数量 |
专用 名称 |
参数类型 |
函数类型 |
---|---|---|---|---|---|
转换 请参见注释 (5)。 |
转换为字符 转换为整数 另请参见: |
1 1 |
CHAR ACHAR ¤ ICHAR IACHAR ¤ |
INTEGER CHARACTER |
CHARACTER INTEGER |
子串的索引 |
字符串 a1 中子串 a2 的位置 请参见注释 (10)。 |
2 |
INDEX |
CHARACTER |
INTEGER |
长度 |
字符实体的长度 请参见注释 (11)。 |
1 |
LEN |
CHARACTER |
INTEGER |
词法上大于或等于 |
a1 ≥ a2 请参见注释 (12)。 |
2 |
LGE |
CHARACTER |
LOGICAL |
词法上大于 |
a1 > a2 请参见注释 (12)。 |
2 |
LGT |
CHARACTER |
LOGICAL |
词法上小于或等于 |
a1≤ a2 请参见注释 (12)。 |
2 |
LLE |
CHARACTER |
LOGICAL |
词法上小于 |
a1 < a2 请参见注释 (12)。 |
2 |
LLT |
CHARACTER |
LOGICAL |
在 ASCII 平台上(包括 Sun 系统):
ACHAR 是 CHAR 的非标准同义词
IACHAR 是 ICHAR 的非标准同义词
在非 ASCII 平台上,ACHAR 和 IACHAR 专门用于提供一种直接处理 ASCII 的方法。
其他一些函数包括按位函数、环境查询函数以及内存分配和解除分配函数。
这些函数都不属于 FORTRAN 77 标准。
表 3–6 Fortran 77 按位操作函数
按位操作 |
参数数量 |
专用名称 |
参数类型 |
函数类型 |
---|---|---|---|---|
补 |
1 |
NOT |
INTEGER |
INTEGER |
与 |
22 |
AND IAND |
INTEGER |
INTEGER |
或 |
22 |
OR IOR |
INTEGER |
INTEGER |
异或 |
22 |
XOR IEOR |
INTEGER |
INTEGER |
移位 请参见注释 (14)。 |
2 |
ISHFT |
INTEGER |
INTEGER |
左移位 请参见注释 (14)。 |
2 |
LSHIFT |
INTEGER |
INTEGER |
右移位 请参见注释 (14)。 |
2 |
RSHIFT |
INTEGER |
INTEGER |
逻辑右移位 请参见注释 (14)。 |
2 |
LRSHFT |
INTEGER |
INTEGER |
循环移位 |
3 |
ISHFTC |
INTEGER |
INTEGER |
提取位 |
3 |
IBITS |
INTEGER |
INTEGER |
设置位 |
2 |
IBSET |
INTEGER |
INTEGER |
测试位 |
2 |
BTEST |
INTEGER |
LOGICAL |
清除位 |
2 |
IBCLR |
INTEGER |
INTEGER |
以上函数可用作内函数,也可以用作外部函数。另请参见《Fortran 库参考》手册中介绍的库位操作例程。
这些函数都不属于 FORTRAN 77 标准。
表 3–7 Fortran 77 环境查询函数
定义 |
参数数量 |
通用名称 |
参数类型 |
函数类型 |
---|---|---|---|---|
编号系统的基数 |
1 |
EPBASE |
INTEGER REAL DOUBLE REAL*16 |
INTEGER INTEGER INTEGER INTEGER |
有效位数 |
1 |
EPPREC |
INTEGER REAL DOUBLE REAL*16 |
INTEGER INTEGER INTEGER INTEGER |
最小指数 |
1 |
EPEMIN |
REAL DOUBLE REAL*16 |
INTEGER INTEGER INTEGER |
最大指数 |
1 |
EPEMAX |
REAL DOUBLE REAL*16 |
INTEGER INTEGER INTEGER |
最小的非零数 |
1 |
EPTINY |
REAL DOUBLE REAL*16 |
REAL DOUBLE REAL*16 |
可表示的最大数 |
1 |
EPHUGE |
INTEGER REAL DOUBLE REAL*16 |
INTEGER REAL DOUBLE REAL*16 |
Epsilon 请参见注释 (16)。 |
1 |
EPMRSP |
REAL DOUBLE REAL*16 |
REAL DOUBLE REAL*16 |
这些函数都不属于 FORTRAN 77 标准。
表 3–8 Fortran 77 内存函数
内函数 |
定义 |
参数数量 |
专用名称 |
参数类型 |
函数类型 |
---|---|---|---|---|---|
位置 |
地址 请参见注释 (17)。 |
1 |
LOC |
任意 |
INTEGER*4INTEGER*8 |
分配 |
分配内存并返回地址。 请参见注释 (17)。 |
1 |
MALLOC MALLOC64 |
INTEGER*4 INTEGER*8 |
INTEGER INTEGER*8 |
解除分配 |
解除分配由 MALLOC 分配的内存。请参见注释 (17)。 |
1 |
FREE |
任意 |
- |
大小 |
返回以字节数表示的参数大小 请参见注释 (18)。 |
1 |
SIZEOF |
任意表达式 |
INTEGER |
以下备注适用于本章中的所有内函数表。
缩写 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。
本节列出了 f95 可以识别的 VMS FORTRAN 内例程。当然,它们不是标准的例程。¤
通用名称 |
专用名称 |
功能 |
参数类型 |
结果类型 |
---|---|---|---|---|
|
CDABS CDEXP CDLOG CDSQRT |
绝对值 指数,e**a 自然对数 平方根 |
COMPLEX*16 COMPLEX*16 COMPLEX*16 COMPLEX*16 |
REAL*8 COMPLEX*16 COMPLEX*16 COMPLEX*16 |
|
CDSIN CDCOS |
正弦 余弦 |
COMPLEX*16 COMPLEX*16 |
COMPLEX*16 COMPLEX*16 |
DCMPLX |
DCONJG DIMAG DREAL |
转换为 DOUBLE COMPLEX 复数共轭 复数的虚部 复数的实部 |
任意数值 COMPLEX*16 COMPLEX*16 COMPLEX*16 |
COMPLEX*16 COMPLEX*16 REAL*8 REAL*8 |
通用名称 |
专用名称 |
功能 |
参数类型 |
结果类型 |
---|---|---|---|---|
SIND |
SIND DSIND QSIND |
正弦 |
- REAL*4 REAL*8 REAL*16 |
- REAL*4 REAL*8 REAL*16 |
COSD |
COSD DCOSD QCOSD |
余弦 |
- REAL*4 REAL*8 REAL*16 |
- REAL*4 REAL*8 REAL*16 |
TAND |
TAND DTAND QTAND |
正切 |
- REAL*4 REAL*8 REAL*16 |
- REAL*4 REAL*8 REAL*16 |
ASIND |
ASIND DASIND QASIND |
反正弦 |
- REAL*4 REAL*8 REAL*16 |
- REAL*4 REAL*8 REAL*16 |
ACOSD |
ACOSD DACOSD QACOSD |
反余弦 |
- REAL*4 REAL*8 REAL*16 |
- REAL*4 REAL*8 REAL*16 |
ATAND |
ATAND DATAND QATAND |
反正切 |
- REAL*4 REAL*8 REAL*16 |
- REAL*4 REAL*8 REAL*16 |
ATAN2D |
ATAN2D DATAN2D QATAN2D |
a1/a2 的反正切 |
- REAL*4 REAL*8 REAL*16 |
- REAL*4 REAL*8 REAL*16 |
通用名称 |
专用名称 |
功能 |
参数类型 |
结果类型 |
---|---|---|---|---|
IBITS |
IIBITS JIBITS KIBITS |
从 a1 中初始位 a2 提取 a3 个位 |
- INTEGER*2 INTEGER*4 INTEGER*8 |
- INTEGER*2 INTEGER*4 INTEGER*8 |
ISHFT |
IISHFT JISHFT KISHFT |
将 a1 逻辑移动 a2 个位;如果 a2 是正数,则向左移动;如果 a2 是负数,则向右移动 |
- INTEGER*2 INTEGER*4 INTEGER*8 |
- INTEGER*2 INTEGER*4 INTEGER*8 |
ISHFTC |
IISHFTC JISHFTC |
在 a1 中,将右边的 a3 个位循环移动 a2 个位置 |
- INTEGER*2 INTEGER*4 |
- INTEGER*2 INTEGER*4 |
IAND |
IIAND JIAND |
a1、a2 的按位 AND |
- INTEGER*2 INTEGER*4 |
- INTEGER*2 INTEGER*4 |
IOR |
IIOR JIOR KIOR |
a1、a2 的按位 OR |
- INTEGER*2 INTEGER*4 INTEGER*8 |
- INTEGER*2 INTEGER*4 INTEGER*8 |
IEOR |
IIEOR JIEOR KIEOR |
a1、a2 的按位互斥 OR |
- INTEGER*2 INTEGER*4 INTEGER*8 |
- INTEGER*2 INTEGER*4 INTEGER*8 |
NOT |
INOT JNOT KNOT |
按位补充 |
- INTEGER*2 INTEGER*4 INTEGER*8 |
- INTEGER*2 INTEGER*4 INTEGER*8 |
IBSET |
IIBSET JIBSET KIBSET |
在 a1 中,将位 a2 设置为 1;返回新的 a1 |
- INTEGER*2 INTEGER*4 INTEGER*8 |
- INTEGER*2 INTEGER*4 INTEGER*8 |
BTEST |
BITEST BJTEST BKTEST |
如果 a1 的位 a2 为 1,则返回 .TRUE. |
- INTEGER*2 INTEGER*4 INTEGER*8 |
- LOGICAL LOGICAL LOGICAL |
IBCLR |
IIBCLR JIBCLR KIBCLR |
在 a1 中,将位 a2 设置为 0;返回新的 a1 |
- INTEGER*2 INTEGER*4 INTEGER*8 |
- INTEGER*2 INTEGER*4 INTEGER*8 |
Fortran 标准没有解决可能出现的多个整数类型问题。编译器通过将专用的 INTEGER-to-INTEGER 函数名(IABS 等)视为一种特殊的通用名称,来处理出现的多个整数类型。可以使用参数类型选择相应的运行时例程名称,而程序员无法访问该名称。
VMS Fortran 采用了类似的方法,但是可以使用专用名称。
表 3–12 VMS 整数函数
专用名称 |
功能 |
参数类型 |
结果类型 |
---|---|---|---|
IIABS JIABS KIABS |
绝对值 |
INTEGER*2 INTEGER*4 INTEGER*8 |
INTEGER*2 INTEGER*4 INTEGER*8 |
IMAX0 JMAX0 |
最大值 |
INTEGER*2 INTEGER*4 |
INTEGER*2 INTEGER*4 |
IMIN0 JMIN0 |
最小值 |
INTEGER*2 INTEGER*4 |
INTEGER*2 INTEGER*4 |
IIDIM JIDIM KIDIM |
正偏差 |
INTEGER*2 INTEGER*4 INTEGER*8 |
INTEGER*2 INTEGER*4 INTEGER*8 |
IMOD JMOD |
a1/a2 的余数 |
INTEGER*2 INTEGER*4 |
INTEGER*2 INTEGER*4 |
IISIGN JISIGN KISIGN |
符号传输,|a1|* sign(a2) |
INTEGER*2 INTEGER*4 INTEGER*8 |
INTEGER*2 INTEGER*4 INTEGER*8 |