Node: REAL() and AIMAG() of Complex, Next: CMPLX() of DOUBLE PRECISION, Previous: Generics and Specifics, Up: Functions and Subroutines

`REAL()`

and `AIMAG()`

of ComplexThe 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.