Description
When we declare a real variable in our API, we have to use some variable to represent the real kind. Available options for single, double and quadruple precision that people have used in codes:
real(sp)
,real(dp)
,real(qp)
real(real32)
,real(real64)
,real(real128)
real(r32)
,real(r64)
,real(r128)
real(float32)
,real(float64)
,real(float128)
real(f32)
,real(f64)
,real(f128)
real(wp)
(for default real)real(r4)
,real(r8)
,real(r16)
I will keep appending to this list if we find some code that uses different names.
Those variables must be defined somewhere. I will use the case 1. below, for other cases we simply substitute different names. The available options:
a. stdlib_types
module that provides sp
, dp
, qp
for single, double and quadruple precision as follows:
integer, parameter :: sp=kind(0.), & ! single precision
dp=kind(0.d0), & ! double precision
qp=selected_real_kind(32) ! quadruple precision
The main idea behind this option is that there is a module in stdlib
that provides the types and every other module uses it. The proposal #13 is similar to it. There are several options how the types are defined inside the module: one can define sp
and dp
using selected_real_kind
also. Another alternative is to define sp
, dp
and qp
using iso_fortran_env as in b. to a. The module stdlib_types
can be called differently also.
b. use iso_fortran_env, only: sp=>real32, dp=>real64, qp=>real128
(if the case 2. above is used, then one does not need to rename, so it simplifies to just use iso_fortran_env, only: real32, real64, real128
). Unlike a., this option does not introduce a new module in stdlib. One simply uses iso_fortran_env
everywhere directly.
c. use iso_c_binding, only: sp=>c_float, dp=>c_double, qp=>c_float128
. Unlike a., this option does not introduce a new module in stdlib.
I will keep this list updated if more options become available.