Node: REAL() and AIMAG() of Complex, Next: CMPLX() of DOUBLE PRECISION, Previous: Generics and Specifics, Up: Functions and Subroutines
REAL() and AIMAG() of Complex
The GNU Fortran language disallows REAL(expr)
and AIMAG(expr),
where expr is any COMPLEX type other than COMPLEX(KIND=1),
except when they are used in the following way:
REAL(REAL(expr))
REAL(AIMAG(expr))
The above forms explicitly specify that the desired effect
is to convert the real or imaginary part of expr, which might
be some REAL type other than REAL(KIND=1),
to type REAL(KIND=1),
and have that serve as the value of the expression.
The GNU Fortran language offers clearly named intrinsics to extract the real and imaginary parts of a complex entity without any conversion:
REALPART(expr)
IMAGPART(expr)
To express the above using typical extended FORTRAN 77,
use the following constructs
(when expr is COMPLEX(KIND=2)):
DBLE(expr)
DIMAG(expr)
The FORTRAN 77 language offers no way
to explicitly specify the real and imaginary parts of a complex expression of
arbitrary type, apparently as a result of requiring support for
only one COMPLEX type (COMPLEX(KIND=1)).
The concepts of converting an expression to type REAL(KIND=1) and
of extracting the real part of a complex expression were
thus "smooshed" by FORTRAN 77 into a single intrinsic, since
they happened to have the exact same effect in that language
(due to having only one COMPLEX type).
Note: When -ff90 is in effect,
g77 treats REAL(expr), where expr is of
type COMPLEX, as REALPART(expr),
whereas with -fugly-complex -fno-f90 in effect, it is
treated as REAL(REALPART(expr)).
See Ugly Complex Part Extraction, for more information.