Confusing double precision real in Fortran
Have this burning question on my mind right now: What is the "accepted" way to declare double precision real in modern Fortran? In order from oldest to newest, the story seems to go like this: DOUBLE PRECISION
, then REAL(kind=8)
, then INTEGER, PARAMETER :: dp=kind(1.d0)
with REAL(kind=dp)
--Metcalf now says dp=kind(0.d0)
--and now float32=selected_real_kind(6,37)
or float64=selected_real_kind(15,307)
. So...
- How should I be declaring double precision real now?
- Is
kind
redundant inREAL(kind=dp)
? - Are there any special flags needed at compile time to invoke double precision real with
gfortran
orifort
?
Solution 1:
Personally I now write
use, intrinsic :: iso_fortran_env
which includes parameters such as int32
,real64
which have the obvious meanings, and can be used like this:
real(real64) :: a_64_bit_real_scalar
Note that kind=8
is not guaranteed, by the standard, to deliver an 8-byte kind. The values that kind parameters take are not standardised and do vary from compiler to compiler.
You could, if you want, write statements such as
use, intrinsic :: iso_fortran_env, dp=>real64
...
real(dp) :: a_64_bit_real_scalar
Solution 2:
1)How should I be declaring double precision real now?
I personally prefer using the
integer, parameter :: wp = selected_real_kind(15,307)
real(wp) :: var
method for this. But as Mark points out, the iso_fortran_env
is another straight-forward method. If you plan on using interfaces to C, you may want to try the ISO_C_BINDING module and use
use iso_c_binding
real(c_double) :: var
And get the double precision you want.
2) Is
kind
redundant inREAL(kind=dp)
?
Yes it is.
3) Are there any special flags needed at compile time to invoke double precision real with
gfortran
orifort
?
For gfortran
you can use the compilation flag -fdefault-real-8
. For ifort
, you can use the -real-size=64
flag.