blob: 518571e0efd253e9d5ebe2533c40f6d082ab4125 [file] [log] [blame] [view]
peter klausler3cecff62018-09-25 20:26:351<!--
2Copyright (c) 2018, NVIDIA CORPORATION. All rights reserved.
3-->
4
peter klauslere7c5a4702018-09-25 22:23:015# A categorization of standard (2018) and extended Fortran intrinsic procedures
6
7This note attempts to group the intrinsic procedures of Fortran into categories
8of functions or subroutines with similar interfaces as an aid to
9comprehension beyond that which might be gained from the standard's
10alphabetical list.
11
12Few procedures are actually described here apart from their interfaces; see the
13Fortran 2018 standard (section 16) for the complete story.
14
15Intrinsic modules are not covered here.
peter klausler3cecff62018-09-25 20:26:3516
17## General rules
18
peter klauslere7c5a4702018-09-25 22:23:01191. The value of any intrinsic function's `KIND` actual argument, if present,
20 must be a scalar constant integer expression, of any kind, whose value
peter klausler3cecff62018-09-25 20:26:3521 resolves to some supported kind of the function's result type.
22 If optional and absent, the kind of the function's result is
23 either the default kind of that category or to the kind of an argument
24 (e.g., as in `AINT`).
251. Procedures are summarized with a non-Fortran syntax for brevity.
26 Wherever a function has a short definition, it appears after an
peter klauslere7c5a4702018-09-25 22:23:0127 equal sign as if it were a statement function. Any functions referenced
28 in these short summaries are intrinsic.
peter klausler3cecff62018-09-25 20:26:35291. Unless stated otherwise, an actual argument may have any supported kind
30 of a particular intrinsic type. Sometimes a pattern variable
31 can appear in a description (e.g., `REAL(k)`) when the kind of an
32 actual argument's type must match the kind of another argument, or
33 determines the kind type parameter of the function result.
341. When an intrinsic type name appears without a kind (e.g., `REAL`),
35 it refers to the default kind of that type. Sometimes the word
36 `default` will appear for clarity.
peter klauslere7c5a4702018-09-25 22:23:01371. The names of the dummy arguments actually matter because they can
38 be used as keywords for actual arguments.
391. All standard intrinsic functions are pure, even when not elemental.
peter klausler9849cf52018-09-25 21:47:55401. Assumed-rank arguments may not appear as actual arguments unless
41 expressly permitted.
peter klausler3cecff62018-09-25 20:26:3542
43# Elemental intrinsic functions
44
peter klauslere7c5a4702018-09-25 22:23:0145Pure elemental semantics apply to these functions, to wit: when one or more of
peter klausler3cecff62018-09-25 20:26:3546the actual arguments are arrays, the arguments must be conformable, and
47the result is also an array.
48Scalar arguments are expanded when the arguments are not all scalars.
49
peter klausler9849cf52018-09-25 21:47:5550## Elemental intrinsic functions that may have unrestricted specific procedures
peter klausler370c44a2018-09-25 23:59:4151
peter klauslere7c5a4702018-09-25 22:23:0152When an elemental intrinsic function is documented here as having an
peter klausler9849cf52018-09-25 21:47:5553_unrestricted specific name_, that name may be passed as an actual
peter klauslere7c5a4702018-09-25 22:23:0154argument, used as the target of a procedure pointer, appear in
55a generic interface, and be otherwise used as if it were an external
56procedure.
peter klauslere7c5a4702018-09-25 22:23:0157An `INTRINSIC` statement or attribute may have to be applied to an
peter klausler370c44a2018-09-25 23:59:4158unrestricted specific name to enable such usage.
peter klauslere7c5a4702018-09-25 22:23:0159
peter klausler9849cf52018-09-25 21:47:5560In such usage, the instance of the function that accepts and returns
peter klausler3cecff62018-09-25 20:26:3561values of the default kinds of the intrinsic types is used.
peter klauslere7c5a4702018-09-25 22:23:0162A Fortran `INTERFACE` could be written to define each of
63these unrestricted specific intrinsic function names.
64
peter klausler3cecff62018-09-25 20:26:3565Calls to dummy arguments and procedure pointers that correspond to these
66specific names must pass only scalar actual argument values.
67
68No other intrinsic function name can be passed as an actual argument,
peter klausler9849cf52018-09-25 21:47:5569used as a pointer target, or appear in a generic interface.
70
71### Trigonometric elemental intrinsic functions, generic and (mostly) specific
72All of these functions can be used as unrestricted specific names.
73
74```
75ACOS(REAL(k) X) -> REAL(k)
76ASIN(REAL(k) X) -> REAL(k)
77ATAN(REAL(k) X) -> REAL(k)
78ATAN(REAL(k) Y, REAL(k) X) -> REAL(k) = ATAN2(Y, X)
79ATAN2(REAL(k) Y, REAL(k) X) -> REAL(k)
80COS(REAL(k) X) -> REAL(k)
81COSH(REAL(k) X) -> REAL(k)
82SIN(REAL(k) X) -> REAL(k)
83SINH(REAL(k) X) -> REAL(k)
84TAN(REAL(k) X) -> REAL(k)
85TANH(REAL(k) X) -> REAL(k)
86```
87
88These `COMPLEX` versions of some of those functions, and the
89inverse hyperbolic functions, cannot be used as specific names.
90```
91ACOS(COMPLEX(k) X) -> COMPLEX(k)
92ASIN(COMPLEX(k) X) -> COMPLEX(k)
93ATAN(COMPLEX(k) X) -> COMPLEX(k)
94ACOSH(REAL(k) X) -> REAL(k)
95ACOSH(COMPLEX(k) X) -> COMPLEX(k)
96ASINH(REAL(k) X) -> REAL(k)
97ASINH(COMPLEX(k) X) -> COMPLEX(k)
98ATANH(REAL(k) X) -> REAL(k)
99ATANH(COMPLEX(k) X) -> COMPLEX(k)
100COS(COMPLEX(k) X) -> COMPLEX(k)
101COSH(COMPLEX(k) X) -> COMPLEX(k)
102SIN(COMPLEX(k) X) -> COMPLEX(k)
103SINH(COMPLEX(k) X) -> COMPLEX(k)
104TAN(COMPLEX(k) X) -> COMPLEX(k)
105TANH(COMPLEX(k) X) -> COMPLEX(k)
106```
107
108### Non-trigonometric elemental intrinsic functions, generic and specific
peter klauslere7c5a4702018-09-25 22:23:01109These functions *can* be used as unrestricted specific names.
peter klausler9849cf52018-09-25 21:47:55110```
peter klauslere7c5a4702018-09-25 22:23:01111ABS(REAL(k) A) -> REAL(k) = SIGN(A, 0.0)
112AIMAG(COMPLEX(k) Z) -> REAL(k) = Z%IM
peter klausler9849cf52018-09-25 21:47:55113AINT(REAL(k) A [, KIND=k ]) -> REAL(KIND)
114ANINT(REAL(k) A [, KIND=k ] -> REAL(KIND)
peter klauslere7c5a4702018-09-25 22:23:01115CONJG(COMPLEX(k) Z) -> COMPLEX(k) = CMPLX(Z%RE, -Z%IM)
peter klausler370c44a2018-09-25 23:59:41116DIM(REAL(k) X, REAL(k) Y) -> REAL(k) = X-MIN(X,Y)
peter klausler9849cf52018-09-25 21:47:55117DPROD(default REAL X, default REAL Y) -> DOUBLE PRECISION = DBLE(X)*DBLE(Y)
118EXP(REAL(k) X) -> REAL(k)
119INDEX(CHARACTER(k) STRING, CHARACTER(k) SUBSTRING [, LOGICAL(any) BACK, KIND=KIND(0) ]) -> INTEGER(KIND)
120LEN(CHARACTER(k,n) STRING [, KIND=KIND(0) ]) -> INTEGER(KIND) = n
121LOG(REAL(k) X) -> REAL(k)
122LOG10(REAL(k) X) -> REAL(k)
123MOD(INTEGER(k) A, INTEGER(k) P) -> INTEGER(k) = A-P*INT(A/P)
124NINT(REAL(k) A [, KIND=KIND(0) ]) -> INTEGER(KIND)
125SIGN(REAL(k) A, REAL(k) B) -> REAL(k)
peter klauslere7c5a4702018-09-25 22:23:01126SQRT(REAL(k) X) -> REAL(k) = X ** 0.5
peter klausler9849cf52018-09-25 21:47:55127```
128
peter klausler970e746c2018-09-25 22:36:00129These variants, however *cannot* be used as specific names without recourse to an alias
130from the following section:
peter klausler9849cf52018-09-25 21:47:55131```
peter klauslere7c5a4702018-09-25 22:23:01132ABS(INTEGER(k) A) -> INTEGER(k) = SIGN(A, 0)
133ABS(COMPLEX(k) A) -> REAL(k) = HYPOT(A%RE, A%IM)
peter klausler370c44a2018-09-25 23:59:41134DIM(INTEGER(k) X, INTEGER(k) Y) -> INTEGER(k) = X-MIN(X,Y)
peter klausler9849cf52018-09-25 21:47:55135EXP(COMPLEX(k) X) -> COMPLEX(k)
136LOG(COMPLEX(k) X) -> COMPLEX(k)
peter klauslere7c5a4702018-09-25 22:23:01137MOD(REAL(k) A, REAL(k) P) -> REAL(k) = A-P*INT(A/P)
peter klausler9849cf52018-09-25 21:47:55138SIGN(INTEGER(k) A, INTEGER(k) B) -> INTEGER(k)
peter klausler370c44a2018-09-25 23:59:41139SQRT(COMPLEX(k) X) -> COMPLEX(k)
peter klausler9849cf52018-09-25 21:47:55140```
peter klausler3cecff62018-09-25 20:26:35141
142### Unrestricted specific aliases for some elemental intrinsic functions with distinct names
143
144```
peter klausler9849cf52018-09-25 21:47:55145ALOG(REAL X) -> REAL = LOG(X)
146ALOG10(REAL X) -> REAL = LOG10(X)
147AMOD(REAL A, REAL P) -> REAL = MOD(A, P)
148CABS(COMPLEX A) = ABS(A)
149CCOS(COMPLEX X) = COS(X)
150CEXP(COMPLEX A) -> COMPLEX = EXP(A)
151CLOG(COMPLEX X) -> COMPLEX = LOG(X)
152CSIN(COMPLEX X) = SIN(X)
153CSQRT(COMPLEX X) -> COMPLEX = SQRT(X)
154CTAN(COMPLEX X) = TAN(X)
155DABS(DOUBLE PRECISION A) = ABS(A)
156DACOS(DOUBLE PRECISION X) = ACOS(X)
157DASIN(DOUBLE PRECISION X) = ASIN(X)
158DATAN(DOUBLE PRECISION X) = ATAN(X)
159DATAN2(DOUBLE PRECISION Y, DOUBLE PRECISION X) = ATAN2(Y, X)
160DCOS(DOUBLE PRECISION X) = COS(X)
161DCOSH(DOUBLE PRECISION X) = COSH(X)
peter klausler370c44a2018-09-25 23:59:41162DDIM(DOUBLE PRECISION X, DOUBLE PRECISION Y) -> DOUBLE PRECISION = X-MIN(X,Y)
peter klausler9849cf52018-09-25 21:47:55163DEXP(DOUBLE PRECISION) -> DOUBLE PRECISION = EXP(A)
164DINT(DOUBLE PRECISION A) -> DOUBLE PRECISION = AINT(A)
165DLOG(DOUBLE PRECISION X) -> DOUBLE PRECISION = LOG(X)
166DLOG10(DOUBLE PRECISION X) -> DOUBLE PRECISION = LOG10(X)
167DMOD(DOUBLE PRECISION A, DOUBLE PRECISION P) -> DOUBLE PRECISION = MOD(A, P)
168DNINT(DOUBLE PRECISION A) = ANINT(A)
169DSIGN(DOUBLE PRECISION A, DOUBLE PRECISION B) -> DOUBLE PRECISION = SIGN(A, B)
170DSIN(DOUBLE PRECISION X) = SIN(X)
171DSINH(DOUBLE PRECISION X) = SINH(X)
172DSQRT(DOUBLE PRECISION X) -> DOUBLE PRECISION = SQRT(X)
173DTAN(DOUBLE PRECISION X) = TAN(X)
174DTANH(DOUBLE PRECISION X) = TANH(X)
175IABS(INTEGER A) = ABS(A)
peter klausler370c44a2018-09-25 23:59:41176IDIM(INTEGER X, INTEGER Y) -> INTEGER = X-MIN(X,Y)
peter klausler9849cf52018-09-25 21:47:55177IDNINT(DOUBLE PRECISION A) = NINT(A)
178ISIGN(INTEGER A, INTEGER B) -> INTEGER = SIGN(A, B)
peter klausler3cecff62018-09-25 20:26:35179```
180
181## Generic elemental intrinsic functions without specific names
182
peter klausler9849cf52018-09-25 21:47:55183(No procedures after this point can be passed as actual arguments, used as
184pointer targets, or appear as specific procedures in generic interfaces.)
185
peter klausler3cecff62018-09-25 20:26:35186### Elemental conversions
187
188```
peter klausler9849cf52018-09-25 21:47:55189ACHAR(INTEGER(k) I [, KIND=KIND('')]) -> CHARACTER(KIND,LEN=1)
190CEILING(REAL() A [, KIND=KIND(0)]) -> INTEGER(KIND)
191CHAR(INTEGER(any) I [, KIND=KIND('')]) -> CHARACTER(KIND,LEN=1)
192CMPLX(COMPLEX(k) X [, KIND=KIND(0.0D0)]) -> COMPLEX(KIND)
193CMPLX(INTEGER or REAL or BOZ X [, INTEGER or REAL or BOZ Y, KIND=KIND((0,0)) ]) -> COMPLEX(KIND)
194EXPONENT(REAL(any) X) -> default INTEGER
195FLOOR(REAL(any) A [, KIND=KIND(0)]) -> INTEGER(KIND)
196IACHAR(CHARACTER(KIND=k,LEN=1) C [, KIND=KIND(0)]) -> INTEGER(KIND)
197ICHAR(CHARACTER(KIND=k,LEN=1) C [, KIND=KIND(0)]) -> INTEGER(KIND)
198INT(INTEGER or REAL or COMPLEX or BOZ A [, KIND=KIND(0) ]) -> INTEGER(KIND)
199LOGICAL(LOGICAL(any) L [, KIND=KIND(.TRUE.) ]) -> LOGICAL(KIND)
200REAL(INTEGER or REAL or COMPLEX or BOZ A [, KIND=KIND(0.0) ]) -> REAL(KIND)
peter klausler3cecff62018-09-25 20:26:35201```
202
203### Other generic elemental intrinsic functions without specific names
204N.B. `BESSEL_JN(N1, N2, X)` and `BESSEL_YN(N1, N2, X)` are categorized
peter klausler9849cf52018-09-25 21:47:55205below with the _transformational_ intrinsic functions.
peter klausler3cecff62018-09-25 20:26:35206
207```
peter klausler9849cf52018-09-25 21:47:55208BESSEL_J0(REAL(k) X) -> REAL(k)
209BESSEL_J1(REAL(k) X) -> REAL(k)
210BESSEL_JN(INTEGER(n) N, REAL(k) X) -> REAL(k)
211BESSEL_Y0(REAL(k) X) -> REAL(k)
212BESSEL_Y1(REAL(k) X) -> REAL(k)
213BESSEL_YN(INTEGER(n) N, REAL(k) X) -> REAL(k)
214ERF(REAL(k) X) -> REAL(k)
215ERFC(REAL(k) X) -> REAL(k)
216ERFC_SCALED(REAL(k) X) -> REAL(k)
217FRACTION(REAL(k) X) -> REAL(k)
218GAMMA(REAL(k) X) -> REAL(k)
peter klausler970e746c2018-09-25 22:36:00219HYPOT(REAL(k) X, REAL(k) Y) -> REAL(k) = SQRT(X*X+Y*Y) without spurious overflow
peter klausler9849cf52018-09-25 21:47:55220IMAGE_STATUS(IMAGE [, scalar TEAM_TYPE TEAM ]) -> default INTEGER
221IS_IOSTAT_END(INTEGER(any) I) -> default LOGICAL
222IS_IOSTAT_EOR(INTEGER(any) I) -> default LOGICAL
223LOG_GAMMA(REAL(k) X) -> REAL(k)
224MAX(INTEGER(k) ...) -> INTEGER(k)
225MAX(REAL(k) ...) -> REAL(k)
226MAX(CHARACTER(KIND=k) ...) -> CHARACTER(KIND=k,LEN=MAX(LEN(...)))
227MERGE(any type TSOURCE, same type FSOURCE, LOGICAL(any) MASK) -> type of FSOURCE
228MIN(INTEGER(k) ...) -> INTEGER(k)
229MIN(REAL(k) ...) -> REAL(k)
230MIN(CHARACTER(KIND=k) ...) -> CHARACTER(KIND=k,LEN=MAX(LEN(...)))
231MODULO(INTEGER(k) A, INTEGER(k) P) -> INTEGER(k); P*result >= 0
232MODULO(REAL(k) A, REAL(k) P) -> REAL(k) = A - P*FLOOR(A/P)
233NEAREST(REAL(k) X, REAL(any) S) -> REAL(k)
234OUT_OF_RANGE(INTEGER or REAL(any) X, scalar INTEGER or REAL(k) MOLD [, scalar LOGICAL(any) ROUND ]) -> default LOGICAL
235RRSPACING(REAL(k) X) -> REAL(k)
236SCALE(REAL(k) X, INTEGER(any) I) -> REAL(k)
237SET_EXPONENT(REAL(k) X, INTEGER(any) I) -> REAL(k)
238SPACING(REAL(k) X) -> REAL(k)
peter klausler3cecff62018-09-25 20:26:35239```
240
peter klausler9849cf52018-09-25 21:47:55241### Restricted specific aliases for elemental conversions &/or extrema with default intrinsic types
peter klausler3cecff62018-09-25 20:26:35242
243```
peter klausler9849cf52018-09-25 21:47:55244AMAX0(INTEGER ...) = REAL(MAX(...))
245AMAX1(REAL ...) = MAX(...)
246AMIN0(INTEGER...) = REAL(MIN(...))
247AMIN1(REAL ...) = MIN(...)
248DBLE(REAL A) = REAL(A, KIND=KIND(0.0D0))
249DMAX1(DOUBLE PRECISION ...) = MAX(...)
250DMIN1(DOUBLE PRECISION ...) = MIN(...)
251FLOAT(INTEGER I) = REAL(I)
252IDINT(DOUBLE PRECISION A) = INT(A)
253IFIX(REAL A) = INT(A)
254MAX0(INTEGER ...) = MAX(...)
255MAX1(REAL ...) = INT(MAX(...))
256MIN0(INTEGER ...) = MIN(...)
257MIN1(REAL ...) = INT(MIN(...))
258SNGL(DOUBLE PRECISION A) = REAL(A)
peter klausler3cecff62018-09-25 20:26:35259```
260
261### Generic elemental bit manipulation intrinsic functions
262```
peter klauslere7c5a4702018-09-25 22:23:01263BGE(INTEGER(n1) or BOZ I, INTEGER(n2) or BOZ J) -> default LOGICAL
264BGT(INTEGER(n1) or BOZ I, INTEGER(n2) or BOZ J) -> default LOGICAL
265BLE(INTEGER(n1) or BOZ I, INTEGER(n2) or BOZ J) -> default LOGICAL
266BLT(INTEGER(n1) or BOZ I, INTEGER(n2) or BOZ J) -> default LOGICAL
peter klausler9849cf52018-09-25 21:47:55267BTEST(INTEGER(n1) I, INTEGER(n2) POS) -> default LOGICAL
268DSHIFTL(INTEGER(k), INTEGER(k) or BOZ J, INTEGER(any) SHIFT) -> INTEGER(k)
269DSHIFTL(BOZ I, INTEGER(k), INTEGER(any) SHIFT) -> INTEGER(k)
270DSHIFTR(INTEGER(k), INTEGER(k) or BOZ J, INTEGER(any) SHIFT) -> INTEGER(k)
271DSHIFTR(BOZ I, INTEGER(k), INTEGER(any) SHIFT) -> INTEGER(k)
272IAND(INTEGER(k) I, INTEGER(k) or BOZ J) -> INTEGER(k)
273IAND(BOZ I, INTEGER(k) J) -> INTEGER(k)
274IBCLR(INTEGER(k) I, INTEGER(any) POS) -> INTEGER(k)
275IBSET(INTEGER(k) I, INTEGER(any) POS) -> INTEGER(k)
276IBITS(INTEGER(k) I, INTEGER(n1) POS, INTEGER(n2) LEN) -> INTEGER(k)
277IEOR(INTEGER(k) I, INTEGER(k) or BOZ J) -> INTEGER(k)
278IEOR(BOZ I, INTEGER(k) J) -> INTEGER(k)
279IOR(INTEGER(k) I, INTEGER(k) or BOZ J) -> INTEGER(k)
280IOR(BOZ I, INTEGER(k) J) -> INTEGER(k)
281ISHFT(INTEGER(k) I, INTEGER(any) SHIFT) -> INTEGER(k)
282ISHFTC(INTEGER(k) I, INTEGER(n1) SHIFT [, INTEGER(n2) SIZE = BIT_SIZE(I) ]) -> INTEGER(k)
283LEADZ(INTEGER(any) I) -> default INTEGER
284MASKL(INTEGER(any) I [, KIND=KIND(0) ]) -> INTEGER(KIND)
285MASKR(INTEGER(any) I [, KIND=KIND(0) ]) -> INTEGER(KIND)
286MERGE_BITS(INTEGER(k) I, INTEGER(k) or BOZ J, INTEGER(k) or BOZ MASK) = IOR(IAND(I,MASK),IAND(J,NOT(MASK)))
287MERGE_BITS(BOZ I, INTEGER(k) J, INTEGER(k) or BOZ MASK) = IOR(IAND(I,MASK),IAND(J,NOT(MASK)))
288NOT(INTEGER(k) I) -> INTEGER(k)
289POPCNT(INTEGER(any) I) -> default INTEGER
peter klauslere7c5a4702018-09-25 22:23:01290POPPAR(INTEGER(any) I) -> default INTEGER = IAND(POPCNT(I), Z'1')
peter klausler9849cf52018-09-25 21:47:55291SHIFTA(INTEGER(k) I, INTEGER(any) SHIFT) -> INTEGER(k)
292SHIFTL(INTEGER(k) I, INTEGER(any) SHIFT) -> INTEGER(k)
293SHIFTR(INTEGER(k) I, INTEGER(any) SHIFT) -> INTEGER(k)
294TRAILZ(INTEGER(any) I) -> default INTEGER
peter klausler3cecff62018-09-25 20:26:35295```
296
peter klausler9849cf52018-09-25 21:47:55297Any typeless "BOZ" argument to `MERGE_BITS` is converted to `INTEGER(k)`. Note that at most one
298of its first two arguments can be a typeless "BOZ" literal.
299
peter klausler3cecff62018-09-25 20:26:35300### Character elemental intrinsic functions
301See also `INDEX` and `LEN` above among the elemental intrinsic functions with
302unrestricted specific names.
peter klausler9849cf52018-09-25 21:47:55303```
304ADJUSTL(CHARACTER(k,LEN=n) STRING) -> CHARACTER(k,LEN=n)
305ADJUSTR(CHARACTER(k,LEN=n) STRING) -> CHARACTER(k,LEN=n)
306LEN_TRIM(CHARACTER(k,n) STRING [, KIND=KIND(0) ]) -> INTEGER(KIND) = n
307LGE(CHARACTER(k,n1) STRING_A, CHARACTER(k,n2) STRING_B) -> default LOGICAL
308LGT(CHARACTER(k,n1) STRING_A, CHARACTER(k,n2) STRING_B) -> default LOGICAL
309LLE(CHARACTER(k,n1) STRING_A, CHARACTER(k,n2) STRING_B) -> default LOGICAL
310LLT(CHARACTER(k,n1) STRING_A, CHARACTER(k,n2) STRING_B) -> default LOGICAL
311SCAN(CHARACTER(k,n) STRING, CHARACTER(k,m) SET [, LOGICAL(any) BACK, KIND ]) -> INTEGER(KIND)
312VERIFY(CHARACTER(k,n) STRING, CHARACTER(k,m) SET [, LOGICAL(any) BACK, KIND ]) -> INTEGER(KIND)
313```
peter klausler3cecff62018-09-25 20:26:35314
peter klausler9849cf52018-09-25 21:47:55315`SCAN` returns the index of the first (or last, if `BACK=.TRUE.`) character in `STRING`
316that is present in `SET`, or zero if none is.
317
318`VERIFY` is the opposite, and returns the index of the first (or last) character
319in `STRING` that is *not* present in `SET`, or zero if all are.
peter klausler3cecff62018-09-25 20:26:35320
peter klauslere7c5a4702018-09-25 22:23:01321# Transformational intrinsic functions
peter klausler3cecff62018-09-25 20:26:35322
peter klausler9849cf52018-09-25 21:47:55323This category comprises a large collection of intrinsic functions that
324are collected together because they somehow transform their arguments
325in a way that prevents them from being elemental.
peter klauslere7c5a4702018-09-25 22:23:01326All of them are pure, however.
peter klausler9849cf52018-09-25 21:47:55327
328Some general rules apply to the transformational intrinsic functions:
329
peter klausler3cecff62018-09-25 20:26:353301. `DIM` arguments are optional; if present, the actual argument must be
331 a scalar integer of any kind.
3321. When an optional `DIM` argument is absent, or an `ARRAY` or `MASK`
333 argument is a vector, the result of the function is scalar; otherwise,
334 the result is an array of the same shape as the `ARRAY` or `MASK`
335 argument with the dimension `DIM` removed from the shape.
3361. When a function takes an optional `MASK` argument, it must be conformable
337 with its `ARRAY` argument if it is present, and the mask can be any kind
338 of `LOGICAL`. It can be scalar.
3391. The type `numeric` here can be any kind of `INTEGER`, `REAL`, or `COMPLEX`.
3401. The type `relational` here can be any kind of `INTEGER`, `REAL`, or `CHARACTER`.
3411. The type `any` here denotes any intrinsic or derived type.
peter klausler9849cf52018-09-25 21:47:553421. The notation `(..)` denotes an array of any rank (but not an assumed-rank array).
peter klausler3cecff62018-09-25 20:26:35343
peter klauslere7c5a4702018-09-25 22:23:01344## Logical reduction transformational intrinsic functions
peter klausler3cecff62018-09-25 20:26:35345```
peter klausler9849cf52018-09-25 21:47:55346ALL(LOGICAL(k) MASK(..) [, DIM ]) -> LOGICAL(k)
347ANY(LOGICAL(k) MASK(..) [, DIM ]) -> LOGICAL(k)
348COUNT(LOGICAL(any) MASK(..) [, DIM, KIND=KIND(0) ]) -> INTEGER(KIND)
349PARITY(LOGICAL(k) MASK(..) [, DIM ]) -> LOGICAL(k)
peter klausler3cecff62018-09-25 20:26:35350```
351
peter klauslere7c5a4702018-09-25 22:23:01352## Numeric reduction transformational intrinsic functions
peter klausler3cecff62018-09-25 20:26:35353```
peter klausler9849cf52018-09-25 21:47:55354IALL(INTEGER(k) ARRAY(..) [, DIM, MASK ]) -> INTEGER(k)
355IANY(INTEGER(k) ARRAY(..) [, DIM, MASK ]) -> INTEGER(k)
356IPARITY(INTEGER(k) ARRAY(..) [, DIM, MASK ]) -> INTEGER(k)
357NORM2(REAL(k) X(..) [, DIM ]) -> REAL(k)
358PRODUCT(numeric ARRAY(..) [, DIM, MASK ]) -> numeric
359SUM(numeric ARRAY(..) [, DIM, MASK ]) -> numeric
peter klausler3cecff62018-09-25 20:26:35360```
361
peter klausler970e746c2018-09-25 22:36:00362`NORM2` generalizes `HYPOT` by computing `SQRT(SUM(X*X))` while avoiding spurious overflows.
363
peter klauslere7c5a4702018-09-25 22:23:01364## Extrema reduction transformational intrinsic functions
peter klausler3cecff62018-09-25 20:26:35365```
peter klausler9849cf52018-09-25 21:47:55366MAXVAL(relational(k) ARRAY(..) [, DIM, MASK ]) -> relational(k)
367MINVAL(relational(k) ARRAY(..) [, DIM, MASK ]) -> relational(k)
peter klausler3cecff62018-09-25 20:26:35368```
369
370### Locational transformational intrinsic functions
371When the optional `DIM` argument is absent, the result is an `INTEGER(KIND)`
372vector whose length is the rank of `ARRAY`.
373When the optional `DIM` argument is present, the result is an `INTEGER(KIND)`
374array of rank `RANK(ARRAY)-1` and shape equal to that of `ARRAY` with
375the dimension `DIM` removed.
376
peter klausler9849cf52018-09-25 21:47:55377The optional `BACK` argument is a scalar LOGICAL value of any kind.
378When present and `.TRUE.`, it causes the function to return the index
379of the *last* occurence of the target or extreme value.
380
peter klausler3cecff62018-09-25 20:26:35381For `FINDLOC`, `ARRAY` may have any of the five intrinsic types, and `VALUE`
382must a scalar value of a type for which `ARRAY==VALUE` or `ARRAY .EQV. VALUE`
383is an acceptable expression.
384
385```
peter klausler9849cf52018-09-25 21:47:55386FINDLOC(intrinsic ARRAY(..), scalar VALUE [, DIM, MASK, KIND=KIND(0), BACK ])
387MAXLOC(relational ARRAY(..) [, DIM, MASK, KIND=KIND(0), BACK ])
388MINLOC(relational ARRAY(..) [, DIM, MASK, KIND=KIND(0), BACK ])
peter klausler3cecff62018-09-25 20:26:35389```
390
peter klauslere7c5a4702018-09-25 22:23:01391## Data rearrangement transformational intrinsic functions
peter klausler3cecff62018-09-25 20:26:35392The optional `DIM` argument to these functions must be a scalar integer of
393any kind, and it takes a default value of 1 when absent.
394
395```
peter klausler9849cf52018-09-25 21:47:55396CSHIFT(any ARRAY(..), INTEGER(any) SHIFT(..) [, DIM ]) -> same type/kind/shape as ARRAY
peter klausler3cecff62018-09-25 20:26:35397```
peter klausler9849cf52018-09-25 21:47:55398Either `SHIFT` is scalar or `RANK(SHIFT) == RANK(ARRAY) - 1` and `SHAPE(SHIFT)` is that of `SHAPE(ARRAY)` with element `DIM` removed.
peter klausler3cecff62018-09-25 20:26:35399
400```
peter klausler9849cf52018-09-25 21:47:55401EOSHIFT(any ARRAY(..), INTEGER(any) SHIFT(..) [, BOUNDARY, DIM ]) -> same type/kind/shape as ARRAY
peter klausler3cecff62018-09-25 20:26:35402```
403* `SHIFT` is scalar or `RANK(SHIFT) == RANK(ARRAY) - 1` and `SHAPE(SHIFT)` is that of `SHAPE(ARRAY)` with element `DIM` removed.
404* If `BOUNDARY` is present, it must have the same type and parameters as `ARRAY`.
405* If `BOUNDARY` is absent, `ARRAY` must be of an intrinsic type, and the default `BOUNDARY` is the obvious `0`, `' '`, or `.FALSE.` value of `KIND(ARRAY)`.
406* If `BOUNDARY` is present, either it is scalar, or `RANK(BOUNDARY) == RANK(ARRAY) - 1` and `SHAPE(BOUNDARY)` is that of `SHAPE(ARRAY)` with element `DIM`
407 removed.
408
409```
peter klausler9849cf52018-09-25 21:47:55410PACK(any ARRAY(..), LOGICAL(any) MASK(..)) -> vector of same type and kind as ARRAY
peter klausler3cecff62018-09-25 20:26:35411```
412* `MASK` is conformable with `ARRAY` and may be scalar.
413* The length of the result vector is `COUNT(MASK)` if `MASK` is an array, else `SIZE(ARRAY)` if `MASK` is `.TRUE.`, else zero.
414
415```
peter klausler9849cf52018-09-25 21:47:55416PACK(any ARRAY(..), LOGICAL(any) MASK(..), any VECTOR(n)) -> vector of same type, kind, and size as VECTOR
peter klausler3cecff62018-09-25 20:26:35417```
418* `MASK` is conformable with `ARRAY` and may be scalar.
419* `VECTOR` has the same type and kind as `ARRAY`.
420* `VECTOR` must not be smaller than result of `PACK` with no `VECTOR` argument.
421* The leading elements of `VECTOR` are replaced with elements from `ARRAY` as
422 if `PACK` had been invoked without `VECTOR`.
423
424```
peter klausler9849cf52018-09-25 21:47:55425RESHAPE(any SOURCE(..), INTEGER(k) SHAPE(n) [, PAD(..), INTEGER(k2) ORDER(n) ]) -> SOURCE array with shape SHAPE
peter klausler3cecff62018-09-25 20:26:35426```
427* If `ORDER` is present, it is a vector of the same size as `SHAPE`, and
428 contains a permutation.
429* The element(s) of `PAD` are used to fill out the result once `SOURCE`
430 has been consumed.
431
432```
peter klausler9849cf52018-09-25 21:47:55433SPREAD(any SOURCE, DIM, scalar INTEGER(any) NCOPIES) -> same type as SOURCE, rank=RANK(SOURCE)+1
434TRANSFORM(any SOURCE, any MOLD) -> scalar if MOLD is scalar, else vector; same type and kind as MOLD
435TRANSFORM(any SOURCE, any MOLD, scalar INTEGER(any) SIZE) -> vector(SIZE) of type and kind of MOLD
436TRANSPOSE(any MATRIX(n,m)) -> matrix(m,n) of same type and kind as MATRIX
peter klausler3cecff62018-09-25 20:26:35437```
438
peter klausler9849cf52018-09-25 21:47:55439The shape of the result of `SPREAD` is the same as that of `SOURCE`, with `NCOPIES` inserted
440at position `DIM`.
441
peter klausler3cecff62018-09-25 20:26:35442```
peter klausler9849cf52018-09-25 21:47:55443UNPACK(any VECTOR(n), LOGICAL(any) MASK(..), FIELD) -> type and kind of VECTOR, shape of MASK
peter klausler3cecff62018-09-25 20:26:35444```
445`FIELD` has same type and kind as `VECTOR` and is conformable with `MASK`.
446
peter klauslere7c5a4702018-09-25 22:23:01447## Other transformational intrinsic functions
peter klausler9849cf52018-09-25 21:47:55448```
449BESSEL_JN(INTEGER(n1) N1, INTEGER(n2) N2, REAL(k) X) -> REAL(k) vector (MAX(N2-N1+1,0))
450BESSEL_YN(INTEGER(n1) N1, INTEGER(n2) N2, REAL(k) X) -> REAL(k) vector (MAX(N2-N1+1,0))
451COMMAND_ARGUMENT_COUNT() -> scalar default INTEGER
452DOT_PRODUCT(LOGICAL(k) VECTOR_A(n), LOGICAL(k) VECTOR_B(n)) -> LOGICAL(k) = ANY(VECTOR_A .AND. VECTOR_B)
453DOT_PRODUCT(COMPLEX(any) VECTOR_A(n), numeric VECTOR_B(n)) = SUM(CONJG(VECTOR_A) * VECTOR_B)
454DOT_PRODUCT(INTEGER(any) or REAL(any) VECTOR_A(n), numeric VECTOR_B(n)) = SUM(VECTOR_A * VECTOR_B)
455MATMUL(numeric ARRAY_A(j), numeric ARRAY_B(j,k)) -> numeric vector(k)
456MATMUL(numeric ARRAY_A(j,k), numeric ARRAY_B(k)) -> numeric vector(j)
457MATMUL(numeric ARRAY_A(j,k), numeric ARRAY_B(k,m)) -> numeric matrix(j,m)
458MATMUL(LOGICAL(n1) ARRAY_A(j), LOGICAL(n2) ARRAY_B(j,k)) -> LOGICAL vector(k)
459MATMUL(LOGICAL(n1) ARRAY_A(j,k), LOGICAL(n2) ARRAY_B(k)) -> LOGICAL vector(j)
460MATMUL(LOGICAL(n1) ARRAY_A(j,k), LOGICAL(n2) ARRAY_B(k,m)) -> LOGICAL matrix(j,m)
461NULL([POINTER/ALLOCATABLE MOLD]) -> POINTER
462REDUCE(any ARRAY(..), function OPERATION [, DIM, LOGICAL(any) MASK(..), IDENTITY, LOGICAL ORDERED ])
463REPEAT(CHARACTER(k,n) STRING, INTEGER(any) NCOPIES) -> CHARACTER(k,n*NCOPIES)
464SELECTED_CHAR_KIND('DEFAULT' or 'ASCII' or 'ISO_10646' or ...) -> scalar default INTEGER
465SELECTED_INT_KIND(scalar INTEGER(any) R) -> scalar default INTEGER
466SELECTED_REAL_KIND([scalar INTEGER(any) P, scalar INTEGER(any) R, scalar INTEGER(any) RADIX]) -> scalar default INTEGER
467SHAPE(SOURCE [, KIND=KIND(0) ]) -> INTEGER(KIND)(RANK(SOURCE))
468TRIM(CHARACTER(k,n) STRING) -> CHARACTER(k)
469```
peter klausler3cecff62018-09-25 20:26:35470
peter klausler9849cf52018-09-25 21:47:55471The type and kind of the result of a numeric `MATMUL` is the same as would result from
472a multiplication of an element of ARRAY_A and an element of ARRAY_B.
peter klausler3cecff62018-09-25 20:26:35473
peter klausler9849cf52018-09-25 21:47:55474The kind of the `LOGICAL` result of a `LOGICAL` `MATMUL` is the same as would result
475from an intrinsic `.AND.` operation between an element of `ARRAY_A` and an element
476of `ARRAY_B`.
peter klausler3cecff62018-09-25 20:26:35477
peter klausler9849cf52018-09-25 21:47:55478Note that `DOT_PRODUCT` with a `COMPLEX` first argument operates on its complex conjugate,
479but that `MATMUL` with a `COMPLEX` argument does not.
peter klausler3cecff62018-09-25 20:26:35480
peter klausler9849cf52018-09-25 21:47:55481The `MOLD` argument to `NULL` may be omitted only in a context where the type of the pointer is known,
482such as an initializer or pointer assignment statement.
peter klausler3cecff62018-09-25 20:26:35483
peter klausler9849cf52018-09-25 21:47:55484At least one argument must be present in a call to `SELECTED_REAL_KIND`.
peter klausler3cecff62018-09-25 20:26:35485
peter klausler9849cf52018-09-25 21:47:55486An assumed-rank array may be passed to `SHAPE`, and if it is associated with an assumed-size array,
487the last element of the result will be -1.
peter klausler3cecff62018-09-25 20:26:35488
peter klauslere7c5a4702018-09-25 22:23:01489## Coarray transformational intrinsic functions
peter klausler9849cf52018-09-25 21:47:55490```
491FAILED_IMAGES([scalar TEAM_TYPE TEAM, KIND=KIND(0)]) -> INTEGER(KIND) vector
492GET_TEAM([scalar INTEGER(?) LEVEL]) -> scalar TEAM_TYPE
493IMAGE_INDEX(COARRAY, INTEGER(any) SUB(n) [, scalar TEAM_TYPE TEAM ]) -> scalar default INTEGER
494IMAGE_INDEX(COARRAY, INTEGER(any) SUB(n), scalar INTEGER(any) TEAM_NUMBER) -> scalar default INTEGER
495NUM_IMAGES([scalar TEAM_TYPE TEAM]) -> scalar default INTEGER
496NUM_IMAGES(scalar INTEGER(any) TEAM_NUMBER) -> scalar default INTEGER
497STOPPED_IMAGES([scalar TEAM_TYPE TEAM, KIND=KIND(0)]) -> INTEGER(KIND) vector
498TEAM_NUMBER([scalar TEAM_TYPE TEAM]) -> scalar default INTEGER
499THIS_IMAGE([COARRAY, DIM, scalar TEAM_TYPE TEAM]) -> default INTEGER
500```
501The result of `THIS_IMAGE` is a scalar if `DIM` is present or if `COARRAY` is absent,
502and a vector whose length is the corank of `COARRAY` otherwise.
503
peter klauslere7c5a4702018-09-25 22:23:01504# Inquiry intrinsic functions
505These are neither elemental nor transformational; all are pure.
506
507## Type inquiry intrinsic functions
peter klausler9849cf52018-09-25 21:47:55508The value of the argument is not used, and may be undefined.
509```
510BIT_SIZE(INTEGER(k) I(..)) -> INTEGER(k)
511DIGITS(INTEGER or REAL X(..)) -> scalar default INTEGER
512EPSILON(REAL(k) X(..)) -> scalar REAL(k)
513HUGE(INTEGER(k) X(..)) -> scalar INTEGER(k)
514HUGE(REAL(k) X(..)) -> scalar of REAL(k)
515KIND(intrinsic X(..)) -> scalar default INTEGER
516MAXEXPONENT(REAL(k) X(..)) -> scalar default INTEGER
517MINEXPONENT(REAL(k) X(..)) -> scalar default INTEGER
518NEW_LINE(CHARACTER(k,n) A(..)) -> scalar CHARACTER(k,1) = CHAR(10)
519PRECISION(REAL(k) or COMPLEX(k) X) -> scalar default INTEGER
520RADIX(INTEGER(k) or REAL(k) X) -> scalar default INTEGER, always 2
521RANGE(INTEGER(k) or REAL(k) or COMPLEX(k) X) -> scalar default INTEGER
522TINY(REAL(k) X(..)) -> scalar REAL(k)
523```
524
peter klauslere7c5a4702018-09-25 22:23:01525## Bound and size inquiry intrinsic functions
peter klausler9849cf52018-09-25 21:47:55526The results are scalar when `DIM` is present, and a vector of length=(co)rank(`(CO)ARRAY`)
527when `DIM` is absent.
528```
529LBOUND(any ARRAY(..) [, DIM, KIND=KIND(0) ]) -> INTEGER(KIND)
530LCOBOUND(any COARRAY [, DIM, KIND=KIND(0) ]) -> INTEGER(KIND)
531SIZE(any ARRAY(..) [, DIM, KIND=KIND(0) ]) -> INTEGER(KIND)
532UBOUND(any ARRAY(..) [, DIM, KIND=KIND(0) ]) -> INTEGER(KIND)
533UCOBOUND(any COARRAY [, DIM, KIND=KIND(0) ]) -> INTEGER(KIND)
534```
535
536Assumed-rank arrays may be used with `LBOUND`, `SIZE`, and `UBOUND`.
537
peter klauslere7c5a4702018-09-25 22:23:01538## Object characteristic inquiry intrinsic functions
peter klausler9849cf52018-09-25 21:47:55539```
540ALLOCATED(any type ALLOCATABLE ARRAY) -> scalar default LOGICAL
541ALLOCATED(any type ALLOCATABLE SCALAR) -> scalar default LOGICAL
542ASSOCIATED(any type POINTER POINTER [, same type TARGET]) -> scalar default LOGICAL
543COSHAPE(COARRAY [, KIND=KIND(0) ]) -> INTEGER(KIND) vector of length corank(COARRAY)
544EXTENDS_TYPE_OF(A, MOLD) -> default LOGICAL
545IS_CONTIGUOUS(any data ARRAY(..)) -> scalar default LOGICAL
546PRESENT(OPTIONAL A) -> scalar default LOGICAL
547RANK(any data A) -> scalar default INTEGER = 0 if A is scalar, SIZE(SHAPE(A)) if A is an array, rank if assumed-rank
548SAME_TYPE_AS(A, B) -> scalar default LOGICAL
549STORAGE_SIZE(any data A [, KIND=KIND(0) ]) -> INTEGER(KIND)
550```
551The arguments to `EXTENDS_TYPE_OF` must be of extensible derived types or be unlimited polymorphic.
552
553An assumed-rank array may be used with `IS_CONTIGUOUS` and `RANK`.
554
peter klauslere7c5a4702018-09-25 22:23:01555# Intrinsic subroutines
peter klausler970e746c2018-09-25 22:36:00556
557(*TODO*: complete these descriptions)
558
peter klauslere7c5a4702018-09-25 22:23:01559## One elemental intrinsic subroutine
peter klausler9849cf52018-09-25 21:47:55560```
561INTERFACE
562 SUBROUTINE MVBITS(FROM, FROMPOS, LEN, TO, TOPOS)
563 INTEGER(k1) :: FROM, TO
564 INTENT(IN) :: FROM
565 INTENT(INOUT) :: TO
566 INTEGER(k2), INTENT(IN) :: FROMPOS
567 INTEGER(k3), INTENT(IN) :: LEN
568 INTEGER(k4), INTENT(IN) :: TOPOS
569 END SUBROUTINE
570END INTERFACE
571```
572
peter klauslere7c5a4702018-09-25 22:23:01573## Non-elemental intrinsic subroutines
peter klausler9849cf52018-09-25 21:47:55574```
575CALL CPU_TIME(REAL INTENT(OUT) TIME)
576```
577The kind of `TIME` is not specified in the standard.
578
579```
peter klausler3cecff62018-09-25 20:26:35580CALL DATA_AND_TIME([DATE, TIME, ZONE, VALUES])
peter klausler9849cf52018-09-25 21:47:55581```
582* All arguments are `OPTIONAL` and `INTENT(OUT)`.
583* `DATE`, `TIME`, and `ZONE` are scalar default `CHARACTER`.
584* `VALUES` is a vector of at least 8 elements of `INTEGER(KIND >= 2)`.
585```
peter klausler3cecff62018-09-25 20:26:35586CALL EVENT_QUERY(EVENT, COUNT [, STAT])
587CALL EXECUTE_COMMAND_LINE(COMMAND [, WAIT, EXITSTAT, CMDSTAT, CMDMSG ])
588CALL GET_COMMAND([COMMAND, LENGTH, STATUS, ERRMSG ])
589CALL GET_COMMAND_ARGUMENT(NUMBER [, VALUE, LENGTH, STATUS, ERRMSG ])
590CALL GET_ENVIRONMENT_VARIABLE(NAME [, VALUE, LENGTH, STATUS, TRIM_NAME, ERRMSG ])
591CALL MOVE_ALLOC(ALLOCATABLE INTENT(INOUT) FROM, ALLOCATABLE INTENT(OUT) TO [, STAT, ERRMSG ])
592CALL RANDOM_INIT(LOGICAL(k1) INTENT(IN) REPEATABLE, LOGICAL(k2) INTENT(IN) IMAGE_DISTINCT)
593CALL RANDOM_NUMBER(REAL(k) INTENT(OUT) HARVEST(..))
594CALL RANDOM_SEED([SIZE, PUT, GET])
595CALL SYSTEM_CLOCK([COUNT, COUNT_RATE, COUNT_MAX])
peter klausler9849cf52018-09-25 21:47:55596```
peter klausler3cecff62018-09-25 20:26:35597
peter klauslere7c5a4702018-09-25 22:23:01598## Atomic intrinsic subroutines
peter klausler9849cf52018-09-25 21:47:55599```
peter klausler3cecff62018-09-25 20:26:35600CALL ATOMIC_ADD(ATOM, VALUE [, STAT=])
601CALL ATOMIC_AND(ATOM, VALUE [, STAT=])
602CALL ATOMIC_CAS(ATOM, OLD, COMPARE, NEW [, STAT=])
603CALL ATOMIC_DEFINE(ATOM, VALUE [, STAT=])
604CALL ATOMIC_FETCH_ADD(ATOM, VALUE, OLD [, STAT=])
605CALL ATOMIC_FETCH_AND(ATOM, VALUE, OLD [, STAT=])
606CALL ATOMIC_FETCH_OR(ATOM, VALUE, OLD [, STAT=])
607CALL ATOMIC_FETCH_XOR(ATOM, VALUE, OLD [, STAT=])
608CALL ATOMIC_OR(ATOM, VALUE [, STAT=])
609CALL ATOMIC_REF(VALUE, ATOM [, STAT=])
610CALL ATOMIC_XOR(ATOM, VALUE [, STAT=])
peter klausler9849cf52018-09-25 21:47:55611```
peter klausler3cecff62018-09-25 20:26:35612
peter klauslere7c5a4702018-09-25 22:23:01613## Collective intrinsic subroutines
peter klausler9849cf52018-09-25 21:47:55614```
peter klausler3cecff62018-09-25 20:26:35615CALL CO_BROADCAST
616CALL CO_MAX
617CALL CO_MIN
618CALL CO_REDUCE
619CALL CO_SUM
peter klausler9849cf52018-09-25 21:47:55620```
peter klausler370c44a2018-09-25 23:59:41621
622# Non-standard intrinsics
623## PGI
624```
625AND, OR, XOR
626LSHIFT, RSHIFT, SHIFT
627ZEXT, IZEXT
628COSD, SIND, TAND, ACOSD, ASIND, ATAND, ATAN2D
629COMPL
630DCMPLX
631EQV, NEQV
632INT8
633JINT, JNINT, KNINT
634LOC
635```
636
637## Intel
638```
639DCMPLX(X,Y), QCMPLX(X,Y)
640DREAL(DOUBLE COMPLEX A) -> DOUBLE PRECISION
641DFLOAT, DREAL
642QEXT, QFLOAT, QREAL
643DNUM, INUM, JNUM, KNUM, QNUM, RNUM - scan value from string
644ZEXT
645RAN, RANF
646ILEN(I) = BIT_SIZE(I)
647SIZEOF
648MCLOCK, SECNDS
649COTAN(X) = 1.0/TAN(X)
650COSD, SIND, TAND, ACOSD, ASIND, ATAND, ATAN2D, COTAND - degrees
651AND, OR, XOR
652LSHIFT, RSHIFT
653IBCHNG, ISHA, ISHC, ISHL, IXOR
654IARG, IARGC, NARGS, NUMARG
655BADDRESS, IADDR
656CACHESIZE, EOF, FP_CLASS, INT_PTR_KIND, ISNAN, LOC
657MALLOC
658```