Bernard
In Fortran, real(z) (where z is complex) does maintain precision. The problem is likely caused by your using "-Ofast", "-ffast-math", or an Intel compiler that uses the equivalent by default (so you have to explicitly switch it off). With such an optimization, e.g. abs(z) is implemented as sqrt(real(z)**2 + aimag(z)**2), which overflows the intermediate squares. Without -ffast-math, compilers use a more expensive implementation that does not overflow.
In your case, I'd assume that the problem is no the call to real, but other complex or real functions. Can you show us a larger part of the code, and the compiler vendor, version, and options you are using?
The C functions CCTK_Cmplx* are deprecated. These days, C compilers implement complex numbers as defined by the standard, and you'd use the respective C standard function instead.
-erik