FORTRAN 77 and VMS Intrinsic Functions
|
This chapter lists the set of FORTRAN 77 intrinsic functions accepted by f95 and is provided to aid migration of programs from legacy FORTRAN 77 to Fortran 95.
f95 recognizes as intrinsic functions all the FORTRAN 77 and VMS functions listed in this chapter, along with all the Fortran 95 functions listed in the previous chapter. As an aid to migrating legacy FORTRAN 77 programs to f95, compiling with -f77=intrinsics causes the compiler to recognize only FORTRAN 77 and VMS functions as intrinsics, and not the Fortran 95 intrinsics.
Intrinsic functions that are Sun extensions of the ANSI FORTRAN 77 standard are marked with . Programs using non-standard intrinsics and library functions may not be portable to other platforms.
Intrinsic functions have generic and specific names when they accept arguments of more than one data type. In general, the generic name returns a value with the same data type as its argument. However, there are exceptions such as the type conversion functions (TABLE 3-2) and the inquiry functions (TABLE 3-7). The function may also be called by one of its specific names to handle a specific argument data type.
With functions that work on more than one data item (e.g. sign(a1,a2) ), all the data arguments must be the same type.
In the following tables, the FORTRAN 77 intrinsic functions are listed by:
- Intrinsic Function -description of what the function does
- Definition - a mathematical definition
- No. of Args. - number of arguments the function accepts
- Generic Name - the function's generic name
- Specific Names - the function's specific names
- Argument Type - data type associated with each specific name
- Function Type - data type returned for specific argument data type
Note - Compiler option -xtypemap changes the default sizes of variables and has an affect on intrinsic references. See Remarks, and the discussion of default sizes and alignment in the Fortran User's Guide.
|
3.1 Arithmetic and Mathematical Functions
This section details arithmetic, type conversion, trigonometric, and other functions. "a" stands for a function's single argument, "a1" and "a2" for the first and second arguments of a two argument function, and "ar" and "ai" for the real and imaginary parts of a function's complex argument.
3.1.1 Arithmetic Functions
TABLE 3-1 Fortran 77 Arithmetic Functions
Intrinsic Function
|
Definition
|
No. of
Args.
|
Generic
Name
|
Specific
Names
|
Argument
Type
|
Function Type
|
Absolute value
See Note (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
|
Truncation
See Note (1).
|
int(a)
|
1
|
AINT
|
AINT
DINT
QINT
|
REAL
DOUBLE
REAL*16
|
REAL
DOUBLE
REAL*16
|
Nearest whole number
|
int(a+.5) if a 0
int(a-.5) if a < 0
|
1
|
ANINT
|
ANINT
DNINT
QNINT
|
REAL
DOUBLE
REAL*16
|
REAL
DOUBLE
REAL*16
|
Nearest integer
|
int(a+.5) if a 0
int(a-.5) if a < 0
|
1
|
NINT
|
NINT
IDNINT
IQNINT
|
REAL
DOUBLE
REAL*16
|
INTEGER
INTEGER
INTEGER
|
Remainder
See Note (1).
|
a1-int(a1/a2)*a2
|
2
|
MOD
|
MOD
AMOD
DMOD
QMOD
|
INTEGER
REAL
DOUBLE
REAL*16
|
INTEGER
REAL
DOUBLE
REAL*16
|
Transfer of sign
|
|a1| if a2 0
-|a1| if a2 < 0
|
2
|
SIGN
|
ISIGN
SIGN
DSIGN
QSIGN
|
INTEGER
REAL
DOUBLE
REAL*16
|
INTEGER
REAL
DOUBLE
REAL*16
|
Positive difference
|
a1-a2 if a1 > a2
0 if a1 a2
|
2
|
DIM
|
IDIM
DIM
DDIM
QDIM
|
INTEGER
REAL
DOUBLE
REAL*16
|
INTEGER
REAL
DOUBLE
REAL*16
|
Double and quad products
|
a1 * a2
|
2
|
-
|
DPROD
QPROD
|
REAL
DOUBLE
|
DOUBLE
REAL*16
|
Choosing largest value
|
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
|
Choosing smallest value
|
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
|
3.1.2 Type Conversion Functions
TABLE 3-2 Fortran 77 Type Conversion Functions
Conversion to
|
No. of Args
|
Generic Name
|
Specific
Names
|
Argument Type
|
Function Type
|
INTEGER
See Note (1).
|
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
See Note (2).
|
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
See Note (3).
|
1
|
DBLE
|
DBLE
DFLOAT
DFLOATK
DREAL
-
-
-
-
-
DBLEQ
-
|
INTEGER
INTEGER
INTEGER*8
REAL
DOUBLE
COMPLEX
COMPLEX*16
REAL*16
COMPLEX*32
REAL*16
COMPLEX*32
|
DOUBLE PRECISION
DOUBLE PRECISION
DOUBLE PRECISION
DOUBLE PRECISION
DOUBLE PRECISION
DOUBLE PRECISION
DOUBLE PRECISION
DOUBLE PRECISION
DOUBLE PRECISION
DOUBLE PRECISION
DOUBLE PRECISION
|
REAL*16
See Note (3').
|
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
|
COMPLEX
See Notes (4) and (8).
|
1 or 2
|
CMPLX
|
-
-
-
-
-
-
-
|
INTEGER
REAL
DOUBLE
REAL*16
COMPLEX
COMPLEX*16
COMPLEX*32
|
COMPLEX
COMPLEX
COMPLEX
COMPLEX
COMPLEX
COMPLEX
COMPLEX
|
DOUBLE COMPLEX
See Note (8).
|
1 or 2
|
DCMPLX
|
-
-
-
-
-
-
-
|
INTEGER
REAL
DOUBLE
REAL*16
COMPLEX
COMPLEX*16
COMPLEX*32
|
DOUBLE COMPLEX
DOUBLE COMPLEX
DOUBLE COMPLEX
DOUBLE COMPLEX
DOUBLE COMPLEX
DOUBLE COMPLEX
DOUBLE COMPLEX
|
COMPLEX*32
See Note (8).
|
1 or 2
|
QCMPLX
|
-
-
-
-
-
-
-
|
INTEGER
REAL
DOUBLE
REAL*16
COMPLEX
COMPLEX*16
COMPLEX*32
|
COMPLEX*32
COMPLEX*32
COMPLEX*32
COMPLEX*32
COMPLEX*32
COMPLEX*32
COMPLEX*32
|
INTEGER
See Note (5).
|
1
|
-
-
|
ICHAR
IACHAR
|
CHARACTER
|
INTEGER
|
CHARACTER
See Note (5).
|
1
|
-
-
|
CHAR
ACHAR
|
INTEGER
|
CHARACTER
|
On an ASCII platform, including Sun systems:
- ACHAR is a nonstandard synonym for CHAR
- IACHAR is a nonstandard synonym for ICHAR
On a non-ASCII platform, ACHAR and IACHAR were intended to provide a way to deal directly with ASCII.
3.1.3 Trigonometric Functions
TABLE 3-3 Fortran 77 Trigonometric Functions
Intrinsic Function
|
Definition
|
Args
|
Generic Name
|
Specific
Names
|
Argument Type
|
Function Type
|
Sine
See Note (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
|
Sine (degrees)
See Note (7).
|
sin(a)
|
1
|
SIND
|
SIND
DSIND
QSIND
|
REAL
DOUBLE
REAL*16
|
REAL
DOUBLE
REAL*16
|
Cosine
See Note (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
|
Cosine (degrees)
See Note (7).
|
cos(a)
|
1
|
COSD
|
COSD
DCOSD
QCOSD
|
REAL
DOUBLE
REAL*16
|
REAL
DOUBLE
REAL*16
|
Tangent
See Note (7).
|
tan(a)
|
1
|
TAN
|
TAN
DTAN
QTAN
|
REAL
DOUBLE
REAL*16
|
REAL
DOUBLE
REAL*16
|
Tangent (degrees)
See Note (7).
|
tan(a)
|
1
|
TAND
|
TAND
DTAND
QTAND
|
REAL
DOUBLE
REAL*16
|
REAL
DOUBLE
REAL*16
|
Arcsine
See Note (7).
|
arcsin(a)
|
1
|
ASIN
|
ASIN
DASIN
QASIN
|
REAL
DOUBLE
REAL*16
|
REAL
DOUBLE
REAL*16
|
Arcsine (degrees)
See Note (7).
|
arcsin(a)
|
1
|
ASIND
|
ASIND
DASIND
QASIND
|
REAL
DOUBLE
REAL*16
|
REAL
DOUBLE
REAL*16
|
Arccosine
See Note (7).
|
arccos(a)
|
1
|
ACOS
|
ACOS
DACOS
QACOS
|
REAL
DOUBLE
REAL*16
|
REAL
DOUBLE
REAL*16
|
Arccosine (degrees)
See Note (7).
|
arccos(a)
|
1
|
ACOSD
|
ACOSD
DACOSD
QACOSD
|
REAL
DOUBLE
REAL*16
|
REAL
DOUBLE
REAL*16
|
Arctangent
See Note (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
|
Arctangent (degrees)
See Note (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
|
Hyperbolic Sine
See Note (7).
|
sinh(a)
|
1
|
SINH
|
SINH
DSINH
QSINH
|
REAL
DOUBLE
REAL*16
|
REAL
DOUBLE
REAL*16
|
Hyperbolic Cosine
See Note (7).
|
cosh(a)
|
1
|
COSH
|
COSH
DCOSH
QCOSH
|
REAL
DOUBLE
REAL*16
|
REAL
DOUBLE
REAL*16
|
Hyperbolic Tangent
See Note (7).
|
tanh(a)
|
1
|
TANH
|
TANH
DTANH
QTANH
|
REAL
DOUBLE
REAL*16
|
REAL
DOUBLE
REAL*16
|
3.1.4 Other Mathematical Functions
TABLE 3-4 Other Fortran 77 Mathematical Functions
Intrinsic Function
|
Definition
|
No. of Args.
|
Generic Name
|
Specific Names
|
Argument Type
|
Function Type
|
Imaginary part of a complex number
See Note (6).
|
ai
|
1
|
IMAG
|
AIMAG
DIMAG
QIMAG
|
COMPLEX
DOUBLE COMPLEX
COMPLEX*32
|
REAL
DOUBLE
REAL*16
|
Conjugate of a complex number
See Note (6).
|
(ar, -ai)
|
1
|
CONJG
|
CONJG
DCONJG
QCONJG
|
COMPLEX
DOUBLE COMPLEX
COMPLEX*32
|
COMPLEX
DOUBLE COMPLEX
COMPLEX*32
|
Square root
|
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
|
Cube root
See Note(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
|
Exponential
|
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
|
Natural logarithm
|
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
|
Common logarithm
|
log10(a)
|
1
|
LOG10
|
ALOG10
DLOG10
QLOG10
|
REAL
DOUBLE
REAL*16
|
REAL
DOUBLE
REAL*16
|
Error function
(See note below)
|
erf(a)
|
1
|
ERF
|
ERF
DERF
|
REAL
DOUBLE
|
REAL
DOUBLE
|
Error function
|
1.0 - erf(a)
|
1
|
ERFC
|
ERFC
DERFC
|
REAL
DOUBLE
|
REAL
DOUBLE
|
- The error function: 2/sqrt(pi) x integral from 0 to a of exp(-t*t) dt
3.2 Character Functions
TABLE 3-5 Fortran 77 Character Functions
Intrinsic Function
|
Definition
|
No. of Args.
|
Specific
Names
|
Argument Type
|
Function Type
|
Conversion
See Note (5).
|
Conversion to character
Conversion to integer
See also:
TABLE 3-2.
|
1
1
|
CHAR
ACHAR
ICHAR
IACHAR
|
INTEGER
CHARACTER
|
CHARACTER
INTEGER
|
Index of a substring
|
Location of substring a2 in string a1
See Note (10).
|
2
|
INDEX
|
CHARACTER
|
INTEGER
|
Length
|
Length of character entity
See Note (11).
|
1
|
LEN
|
CHARACTER
|
INTEGER
|
Lexically greater than or equal
|
a1 a2
See Note (12).
|
2
|
LGE
|
CHARACTER
|
LOGICAL
|
Lexically greater than
|
a1 > a2
See Note (12).
|
2
|
LGT
|
CHARACTER
|
LOGICAL
|
Lexically less than or equal
|
a1 a2
See Note (12).
|
2
|
LLE
|
CHARACTER
|
LOGICAL
|
Lexically less than
|
a1 < a2
See Note (12).
|
2
|
LLT
|
CHARACTER
|
LOGICAL
|
On an ASCII platform (including Sun systems):
- ACHAR is a nonstandard synonym for CHAR
- IACHAR is a nonstandard synonym for ICHAR
On a non-ASCII platform, ACHAR and IACHAR were intended to provide a way to deal directly with ASCII.
3.3 Miscellaneous Functions
Other miscellaneous functions include bitwise functions, environmental inquiry functions, and memory allocation and deallocation functions.
3.3.1 Bit Manipulation
None of these functions are part of the FORTRAN 77 Standard.
TABLE 3-6 Fortran 77 Bitwise Functions
Bitwise Operations
|
No. of Args.
|
Specific Name
|
Argument Type
|
Function Type
|
Complement
|
1
|
NOT
|
INTEGER
|
INTEGER
|
And
|
2
2
|
AND
IAND
|
INTEGER
INTEGER
|
INTEGER
INTEGER
|
Inclusive or
|
2
2
|
OR
IOR
|
INTEGER
INTEGER
|
INTEGER
INTEGER
|
Exclusive or
|
2
2
|
XOR
IEOR
|
INTEGER
INTEGER
|
INTEGER
INTEGER
|
Shift
See Note (14).
|
2
|
ISHFT
|
INTEGER
|
INTEGER
|
Left shift
See Note (14).
|
2
|
LSHIFT
|
INTEGER
|
INTEGER
|
Right shift
See Note (14).
|
2
|
RSHIFT
|
INTEGER
|
INTEGER
|
Logical right shift
See Note (14).
|
2
|
LRSHFT
|
INTEGER
|
INTEGER
|
Circular shift
|
3
|
ISHFTC
|
INTEGER
|
INTEGER
|
Bit extraction
|
3
|
IBITS
|
INTEGER
|
INTEGER
|
Bit set
|
2
|
IBSET
|
INTEGER
|
INTEGER
|
Bit test
|
2
|
BTEST
|
INTEGER
|
LOGICAL
|
Bit clear
|
2
|
IBCLR
|
INTEGER
|
INTEGER
|
The above functions are available as intrinsic or extrinsic functions. See also the discussion of the library bit manipulation routines in the Fortran Library Reference manual.
3.3.2 Environmental Inquiry Functions
None of these functions are part of the FORTRAN 77 Standard.
TABLE 3-7 Fortran 77 Environmental Inquiry Functions
Definition
|
No. of Args.
|
Generic Name
|
Argument Type
|
Function Type
|
Base of Number System
|
1
|
EPBASE
|
INTEGER
REAL
DOUBLE
REAL*16
|
INTEGER
INTEGER
INTEGER
INTEGER
|
Number of Significant Bits
|
1
|
EPPREC
|
INTEGER
REAL
DOUBLE
REAL*16
|
INTEGER
INTEGER
INTEGER
INTEGER
|
Minimum Exponent
|
1
|
EPEMIN
|
REAL
DOUBLE
REAL*16
|
INTEGER
INTEGER
INTEGER
|
Maximum Exponent
|
1
|
EPEMAX
|
REAL
DOUBLE
REAL*16
|
INTEGER
INTEGER
INTEGER
|
Least Nonzero Number
|
1
|
EPTINY
|
REAL
DOUBLE
REAL*16
|
REAL
DOUBLE
REAL*16
|
Largest Number Representable
|
1
|
EPHUGE
|
INTEGER
REAL
DOUBLE
REAL*16
|
INTEGER
REAL
DOUBLE
REAL*16
|
Epsilon
See Note (16).
|
1
|
EPMRSP
|
REAL
DOUBLE
REAL*16
|
REAL
DOUBLE
REAL*16
|
3.3.3 Memory
None of these functions are part of the FORTRAN 77 Standard.
TABLE 3-8 Fortran 77 Memory Functions
Intrinsic Function
|
Definition
|
No. of Args
|
Specific Name
|
Argument Type
|
Function Type
|
Location
|
Address of
See Note (17).
|
1
|
LOC
|
Any
|
INTEGER*4
INTEGER*8
|
Allocate
|
Allocate memory and return address.
See Note (17).
|
1
|
MALLOC
MALLOC64
|
INTEGER*4
INTEGER*8
|
INTEGER
INTEGER*8
|
Deallocate
|
Deallocate memory allocated by MALLOC.
See Note (17).
|
1
|
FREE
|
Any
|
-
|
Size
|
Return the size of the argument in bytes.
See Note (18).
|
1
|
SIZEOF
|
Any expression
|
INTEGER
|
3.4 Remarks
The following remarks apply to all of the intrinsic function tables in this chapter.
- The abbreviation DOUBLE stands for DOUBLE PRECISION.
- An intrinsic that takes INTEGER arguments accepts INTEGER*2, INTEGER*4, or INTEGER*8.
- INTEGER intrinsics that take INTEGER arguments return values of INTEGER type determined as follows. Note that the -xtypemap option may alter the default sizes of actual arguments:
- mod sign dim max min and iand or ior xor ieor -- size of the value returned is the largest of the sizes of the arguments.
- abs ishft lshift rshift lrshft ibset btest ivclr ishftc ibits -- size of the value returned is the size of the first argument.
- int epbase epprec -- size of the value returned is the size of default INTEGER.
- ephuge -- size of the value returned is the size of the default INTEGER, or the size of the argument, whichever is largest.
- Options that change the default data sizes also change the way some intrinsics are used. For example, with -dbl in effect, a call to ZCOS with a DOUBLE COMPLEX argument will automatically become a call to CQCOS because the argument has been promoted to COMPLEX*32. The following functions have this capability:
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
- The following functions permit arguments of an integer or logical type of any size:
and iand ieor iiand iieor iior inot ior jiand jieor jior jnot lrshft lshift not or rshift xor
- An intrinsic that is shown to return a default REAL, DOUBLE PRECISION, COMPLEX, or DOUBLE COMPLEX value will return the prevailing type depending on certain compilation options. For example, if compiled with -xtypemap=real:64,double:64:
- A call to a REAL function returns REAL*8
- A call to a DOUBLE PRECISION function returns REAL*8
- A call to a COMPLEX function returns COMPLEX*16
- A call to a DOUBLE COMPLEX function returns COMPLEX*16
Other options that alter the data sizes of default data types are -r8 and -dbl, which also promote DOUBLE to QUAD. The -xtypemap= option provides more flexibility than these older compiler options and is preferred.
- A function with a generic name returns a value with the same type as the argument--except for type conversion functions, the nearest integer function, the absolute value of a complex argument, and others. If there is more than one argument, they must all be of the same type.
- If a function name is used as an actual argument, then it must be a specific name.
- If a function name is used as a dummy argument, then it does not identify an intrinsic function in the subprogram, and it has a data type according to the same rules as for variables and arrays.
3.4.1 Notes on Functions
Tables and notes 1 through 12 are based on the "Table of Intrinsic Functions," from ANSI X3.9-1978 Programming Language FORTRAN, with the Fortran extensions added.
(1) INT
If A is type integer, then INT(A) is A.
If A is type real or double precision, then:
if |A| < 1, then INT(A) is 0
if |A| 1, then INT(A) is the greatest integer that does not exceed the magnitude of A, and whose sign is the same as the sign of A. (Such a mathematical integer value may be too large to fit in the computer integer type.)
If A is type complex or double complex, then apply the above rule to the real part of A.
If A is type real, then IFIX(A) is the same as INT(A).
(2) REAL
If A is type real, then REAL(A) is A.
If A is type integer or double precision, then REAL(A) is as much precision of the significant part of A as a real datum can contain.
If A is type complex, then REAL(A) is the real part of A.
If A is type double complex, then REAL(A) is as much precision of the significant part of the real part of A as a real datum can contain.
(3) DBLE
If A is type double precision, then DBLE(A) is A.
If A is type integer or real, then DBLE(A) is as much precision of the significant part of A as a double precision datum can contain.
If A is type complex, then DBLE(A) is as much precision of the significant part of the real part of A as a double precision datum can contain.
If A is type COMPLEX*16, then DBLE(A) is the real part of A.
(3') QREAL
If A is type REAL*16, then QREAL(A) is A.
If A is type integer, real, or double precision, then QREAL(A) is as much precision of the significant part of A as a REAL*16 datum can contain.
If A is type complex or double complex, then QREAL(A) is as much precision of the significant part of the real part of A as a REAL*16 datum can contain.
If A is type COMPLEX*16 or COMPLEX*32, then QREAL(A) is the real part of A.
(4) CMPLX
If A is type complex, then CMPLX(A) is A.
If A is type integer, real, or double precision, then CMPLX(A) is
REAL(A) + 0i.
If A1 and A2 are type integer, real, or double precision, then CMPLX(A1,A2) is REAL(A1) + REAL(A2)*i.
If A is type double complex, then CMPLX(A) is
REAL( DBLE(A) ) + i*REAL( DIMAG(A) ).
If CMPLX has two arguments, then they must be of the same type, and they may be one of integer, real, or double precision.
If CMPLX has one argument, then it may be one of integer, real, double precision, complex, COMPLEX*16, or COMPLEX*32.
(4') DCMPLX
If A is type COMPLEX*16, then DCMPLX(A) is A.
If A is type integer, real, or double precision, then DCMPLX(A) is
DBLE(A) + 0i.
If A1 and A2 are type integer, real, or double precision, then DCMPLX(A1,A2) is DBLE(A1) + DBLE(A2)*i.
If DCMPLX has two arguments, then they must be of the same type, and they may be one of integer, real, or double precision.
If DCMPLX has one argument, then it may be one of integer, real, double precision, complex, COMPLEX*16, or COMPLEX*32.
(5) ICHAR
ICHAR(A) is the position of A in the collating sequence.
The first position is 0, the last is N-1, 0ICHAR(A)N-1, where N is the number of characters in the collating sequence, and A is of type character of length one.
CHAR and ICHAR are inverses in the following sense:
- ICHAR(CHAR(I)) = I, for 0IN-1
- CHAR(ICHAR(C)) = C, for any character C capable of representation in the processor
(6) COMPLEX
A COMPLEX value is expressed as an ordered pair of reals, (ar, ai), where ar is the real part, and ai is the imaginary part.
(7) Radians
All angles are expressed in radians, unless the "Intrinsic Function" column includes the "(degrees)" remark.
(8) COMPLEX Function
The result of a function of type COMPLEX is the principal value.
(8') CBRT
If a is of COMPLEX type, CBRT results in COMPLEX RT1=(A, B), where:
A 0.0, and -60 degrees arctan (B/A) < + 60 degrees.
Other two possible results can be evaluated as follows:
- RT2 = RT1 * (-0.5, square_root (0.75))
- RT3 = RT1 * (-0.5, square_root (0.75))
(9) Argument types
All arguments in an intrinsic function reference must be of the same type.
(10) INDEX
INDEX(X,Y) is the place in X where Y starts. That is, it is the starting position within character string X of the first occurrence of character string Y.
If Y does not occur in X, then INDEX(X,Y) is 0.
If LEN(X) < LEN(Y), then INDEX(X,Y) is 0.
INDEX returns default INTEGER*4 data. If compiling for a 64-bit environment, the compiler will issue a warning if the result overflows the INTEGER*4 data range. To use INDEX in a 64-bit environment with character strings larger than the INTEGER*4 limit (2 Gbytes), the INDEX function and the variables receiving the result must be declared INTEGER*8.
(11) LEN
LEN returns the declared length of the CHARACTER argument variable. The actual value of the argument is of no importance.
LEN returns default INTEGER*4 data. If compiling for a 64-bit environment, the compiler will issue a warning if the result overflows the INTEGER*4 data range. To use LEN in a 64-bit environment with character variables larger than the INTEGER*4 limit (2 Gbytes), the LEN function and the variables receiving the result must be declared INTEGER*8.
(12) Lexical Compare
LGE( X, Y ) is true if X=Y, or if X follows Y in the collating sequence; otherwise, it is false.
LGT( X, Y ) is true if X follows Y in the collating sequence; otherwise, it is false.
LLE( X, Y ) is true if X=Y, or if X precedes Y in the collating sequence; otherwise, it is false.
LLT( X, Y ) is true if X precedes Y in the collating sequence; otherwise, it is false.
If the operands for LGE, LGT, LLE, and LLT are of unequal length, the shorter operand is considered as if it were extended on the right with blanks.
(13) Bit Functions
There are other bitwise operations in VMS Fortran, but these are not implemented.
(14) Shift
LSHIFT shifts a1 logically left by a2 bits (inline code).
LRSHFT shifts a1 logically right by a2 bits (inline code).
RSHIFT shifts a1 arithmetically right by a2 bits.
ISHFT shifts a1 logically left if a2 > 0 and right if a2 < 0.
The LSHIFT and RSHIFT functions are the Fortran analogs of the C << and >> operators. As in C, the semantics depend on the hardware.
The behavior of the shift functions with an out of range shift count is hardware dependent and generally unpredictable. In this release, shift counts larger than 31 result in hardware dependent behavior.
(15) Environmental inquiries
Only the type of the argument is significant.
(16) Epsilon
Epsilon is the least e, such that 1.0 + e 1.0.
(17) LOC, MALLOC, and FREE
The LOC function returns the address of a variable or of an external procedure. The function call MALLOC( n ) allocates a block of at least n bytes, and returns the address of that block.
LOC returns default INTEGER*4 in 32-bit environments, INTEGER*8 in 64-bit environments.
MALLOC is a library function and not an intrinsic in FORTRAN 77. It too returns default INTEGER*4 in 32-bit environments, INTEGER*8 in 64-bit environments. However, MALLOC must be explicitly declared INTEGER*8 when compiling for 64-bit environments.
The value returned by LOC or MALLOC should be stored in variables typed POINTER, INTEGER*4, or INTEGER*8 in 64-bit environments. The argument to FREE must be the value returned by a previous call to MALLOC and hence should have data type POINTER, INTEGER*4, or INTEGER*8.
MALLOC64 always takes an INTEGER*8 argument (size of memory request in bytes) and always returns an INTEGER*8 value. Use this routine rather than MALLOC when compiling programs that must run in both 32-bit and 64-bit environments. The receiving variable must be declared either POINTER or INTEGER*8.
(18) SIZEOF
The SIZEOF intrinsic cannot be applied to arrays of an assumed size, characters of a length that is passed, or subroutine calls or names. SIZEOF returns default INTEGER*4 data. If compiling for a 64-bit environment, the compiler will issue a warning if the result overflows the INTEGER*4 data range. To use SIZEOF in a 64-bit environment with arrays larger than the INTEGER*4 limit (2 Gbytes), the SIZEOF function and the variables receiving the result must be declared INTEGER*8.
3.5 VMS Intrinsic Functions
This section lists VMS FORTRAN intrinsic routines recognized by f95. They are, of course, nonstandard.
3.5.1 VMS Double-Precision Complex
TABLE 3-9 VMS Double-Precision Complex Functions
Generic Name
|
Specific Names
|
Function
|
Argument Type
|
Result Type
|
|
CDABS
CDEXP
CDLOG
CDSQRT
|
Absolute value
Exponential, e**a
Natural log
Square root
|
COMPLEX*16
COMPLEX*16
COMPLEX*16
COMPLEX*16
|
REAL*8
COMPLEX*16
COMPLEX*16
COMPLEX*16
|
|
CDSIN
CDCOS
|
Sine
Cosine
|
COMPLEX*16
COMPLEX*16
|
COMPLEX*16
COMPLEX*16
|
DCMPLX
|
DCONJG
DIMAG
DREAL
|
Convert to DOUBLE COMPLEX
Complex conjugate
Imaginary part of complex
Real part of complex
|
Any numeric
COMPLEX*16
COMPLEX*16
COMPLEX*16
|
COMPLEX*16
COMPLEX*16
REAL*8
REAL*8
|
3.5.2 VMS Degree-Based Trigonometric
TABLE 3-10 VMS Degree-Based Trigonometric Functions
Generic Name
|
Specific Names
|
Function
|
Argument Type
|
Result Type
|
SIND
|
SIND
DSIND
QSIND
|
Sine
|
-
REAL*4
REAL*8
REAL*16
|
-
REAL*4
REAL*8
REAL*16
|
COSD
|
COSD
DCOSD
QCOSD
|
Cosine
|
-
REAL*4
REAL*8
REAL*16
|
-
REAL*4
REAL*8
REAL*16
|
TAND
|
TAND
DTAND
QTAND
|
Tangent
|
-
REAL*4
REAL*8
REAL*16
|
-
REAL*4
REAL*8
REAL*16
|
ASIND
|
ASIND
DASIND
QASIND
|
Arc sine
|
-
REAL*4
REAL*8
REAL*16
|
-
REAL*4
REAL*8
REAL*16
|
ACOSD
|
ACOSD
DACOSD
QACOSD
|
Arc cosine
|
-
REAL*4
REAL*8
REAL*16
|
-
REAL*4
REAL*8
REAL*16
|
ATAND
|
ATAND
DATAND
QATAND
|
Arc tangent
|
-
REAL*4
REAL*8
REAL*16
|
-
REAL*4
REAL*8
REAL*16
|
ATAN2D
|
ATAN2D
DATAN2D
QATAN2D
|
Arc tangent of a1/a2
|
-
REAL*4
REAL*8
REAL*16
|
-
REAL*4
REAL*8
REAL*16
|
3.5.3 VMS Bit-Manipulation
TABLE 3-11 VMS Bit-Manipulation Functions
Generic Name
|
Specific Names
|
Function
|
Argument Type
|
Result Type
|
IBITS
|
IIBITS
JIBITS
KIBITS
|
From a1, initial bit a2, extract a3 bits
|
-
INTEGER*2
INTEGER*4
INTEGER*8
|
-
INTEGER*2
INTEGER*4
INTEGER*8
|
ISHFT
|
IISHFT
JISHFT
KISHFT
|
Shift a1 logically by a2 bits; if a2 positive shift left, if a2 negative shift right
|
-
INTEGER*2
INTEGER*4
INTEGER*8
|
-
INTEGER*2
INTEGER*4
INTEGER*8
|
ISHFTC
|
IISHFTC
JISHFTC
|
In a1, circular shift by a2 places, of right a3 bits
|
-
INTEGER*2
INTEGER*4
|
-
INTEGER*2
INTEGER*4
|
IAND
|
IIAND
JIAND
|
Bitwise AND of a1, a2
|
-
INTEGER*2
INTEGER*4
|
-
INTEGER*2
INTEGER*4
|
IOR
|
IIOR
JIOR
KIOR
|
Bitwise OR of a1, a2
|
-
INTEGER*2
INTEGER*4
INTEGER*8
|
-
INTEGER*2
INTEGER*4
INTEGER*8
|
IEOR
|
IIEOR
JIEOR
KIEOR
|
Bitwise exclusive OR of a1, a2
|
-
INTEGER*2
INTEGER*4
INTEGER*8
|
-
INTEGER*2
INTEGER*4
INTEGER*8
|
NOT
|
INOT
JNOT
KNOT
|
Bitwise complement
|
-
INTEGER*2
INTEGER*4
INTEGER*8
|
-
INTEGER*2
INTEGER*4
INTEGER*8
|
IBSET
|
IIBSET
JIBSET
KIBSET
|
In a1, set bit a2 to 1; return new a1
|
-
INTEGER*2
INTEGER*4
INTEGER*8
|
-
INTEGER*2
INTEGER*4
INTEGER*8
|
BTEST
|
BITEST
BJTEST
BKTEST
|
If bit a2 of a1 is 1, return .TRUE.
|
-
INTEGER*2
INTEGER*4
INTEGER*8
|
-
INTEGER*2
INTEGER*4
INTEGER*8
|
IBCLR
|
IIBCLR
JIBCLR
KIBCLR
|
In a1, set bit a2 to 0; return new a1
|
-
INTEGER*2
INTEGER*4
INTEGER*8
|
-
INTEGER*2
INTEGER*4
INTEGER*8
|
3.5.4 VMS Multiple Integer Types
The possibility of multiple integer types is not addressed by the Fortran Standard. The compiler copes with their existence by treating a specific INTEGER-to-INTEGER function name (IABS, and so forth) as a special sort of generic. The argument type is used to select the appropriate runtime routine name, which is not accessible to the programmer.
VMS Fortran takes a similar approach, but makes the specific names available.
TABLE 3-12 VMS Integer Functions
Specific Names
|
Function
|
Argument Type
|
Result Type
|
IIABS
JIABS
KIABS
|
Absolute value
|
INTEGER*2
INTEGER*4
INTEGER*8
|
INTEGER*2
INTEGER*4
INTEGER*8
|
IMAX0
JMAX0
|
Maximum
|
INTEGER*2
INTEGER*4
|
INTEGER*2
INTEGER*4
|
IMIN0
JMIN0
|
Minimum 1
|
INTEGER*2
INTEGER*4
|
INTEGER*2
INTEGER*4
|
IIDIM
JIDIM
KIDIM
|
Positive difference
|
INTEGER*2
INTEGER*4
INTEGER*8
|
INTEGER*2
INTEGER*4
INTEGER*8
|
IMOD
JMOD
|
Remainder of a1/a2
|
INTEGER*2
INTEGER*4
|
INTEGER*2
INTEGER*4
|
IISIGN
JISIGN
KISIGN
|
Transfer of sign, |a1|* sign(a2)
|
INTEGER*2
INTEGER*4
INTEGER*8
|
INTEGER*2
INTEGER*4
INTEGER*8
|