Failure of implicit real*8

Tobias Burnus burnus@net-b.de
Sun Feb 20 08:55:00 GMT 2011


Michael D. Berger wrote:
> Using:
>     gfortran44 -fdefault-real-8
>
> I have two nearly identical subroutines very similar to:
>     subroutine orderRows(mx, idxSort, nrows, ncols)
>     dimension idxSort(nrows),mx(nrows,ncols),tmp(nrows,ncols)
>     ...
> where mx is expected to be real, in particular, real*8 because
> of the compile option.
>
> But one of the two interprets mx as an integer, giving
> radically wrong results.

Without an IMPLICIT statement, one has:
   IMPLICIT REAL(A-H, O-Z), INTEGER(I-N)
Thus, "MX" is implicitly type as INTEGER. You need to either explicitly 
type MX as REAL (or REAL*8) or you have to add an IMPLICIT statement for 
"M" which types it as REAL.

In the quote above you do not have any IMPLICIT statement, hence, it 
make sense that MX is typeset as integer. As -fdefault-real-8 only 
applies to REAL variables/PARAMETER and to real literals, it is thus not 
effective.

As other have already mentioned: It is recommended to use IMPLICIT NONE 
and explicitly declare the variables. Doing so avoids difficult to find 
issues like the one you have.

Regarding -fdefault-real-8: Note that this option does not influence 
variables which have been typed with a kind-type parameter, e.g., 
"REAL*4" remains a 4-byte variable even with that flag.

Note of caution when not using -fdefault-real-8:  1.0 is a default-real 
variable, thus for, e.g.,
   real*8 sqrt
   sq2 = sqrt(2.0)
you loose precision, unless you do
   sq2 = sqrt(2.0d0)

Tobias



More information about the Fortran mailing list