At 10:00 14-11-2000 -0800, Richard Maine wrote:
[ snip ...]
> I'll probably mess it up off the top of my head, in which
> case I'm sure corrections will be given, but something like
>
> real(working_kind) :: x
> integer, parameter :: higher_kind = selected_real_kind(precision(x)+1)
>
>You might be able to get fancier and ask for a higher precision if
>available, settling for the same kind if it's already the highest,
>but I don't think I'll try the trick of writing that as an
>initialization expression. (Probably doable, but also probably
>ugly. I might be tempted to just make it a system-dependent
>parameter and hand-set it in a system-dependent module).
>
>For my part, I never use double precision declarations in f90 code.
>If I really wanted double precision, I'd still use the kind syntax
>and use the rd_kind parameter from my precision module. This
>code lifted right out of the module I normally use - though I far
>more commonly use some of the other parameters from the module.
>(Most on the list will probably recognize the derivations of
>several of my parameter names).
>
>!-- 4 Mar 92, Richard Maine: Version 1.0.
>
>module precision
>
> !-- Kind constants for system-independent precision specification.
> !-- 4 Mar 92, Richard Maine.
>
> implicit none
> public
>
> !-- System default kinds.
> integer, parameter :: i_kind = kind(0) !-- default integer
> integer, parameter :: rs_kind = kind(0.) !-- real single precision
> integer, parameter :: rd_kind = kind(0.d0) !-- real double precision
>
> !-- Kinds for specified real precisions.
> integer, parameter :: r4_kind = selected_real_kind(6,30) !-- 6 digits
> integer, parameter :: r8_kind = selected_real_kind(12,30) !-- 12 digits
>
> !-- Kinds for specified integer ranges.
> integer, parameter :: i1_kind = selected_int_kind(2) !-- 99 max
> integer, parameter :: i2_kind = selected_int_kind(4) !-- 9,999 max
> integer, parameter :: i4_kind = selected_int_kind(9) !-- 999,999,999 max
>
> !-- Kind for working real precision.
> integer, parameter :: r_kind = r8_kind
If you are interested in the highest available precision or range
you can find it using the following module.
!-->
! [JvO] 2000-08-13 Prec-mod.f90
!-->
! Define highest integer range and real precision kinds.
!-->
module precision_M
implicit NONE
integer, parameter :: byte = selected_int_kind(1)
integer, parameter :: word = selected_int_kind(range(1_byte)+1)
integer, parameter :: long = selected_int_kind(range(1_word)+1)
integer, parameter :: extd = selected_int_kind(range(1_long)+1)
integer, parameter :: mpi = max(byte,word,long,extd) ! Highest
! ^^^
integer, parameter :: sp = kind(1.0e0)
integer, parameter :: dp = kind(1.0d0)
integer, parameter :: ep = &
& selected_real_kind(precision(1.0_dp)+1)
integer, private, parameter :: c = (sign(1, ep) +1) / 2
integer, parameter :: mpr = (1-c) * dp + c * ep ! Highest available
! ^^^ Another way to do the same.
character(len=*), parameter :: fmt_I = "(A, T11, I21)"
character(len=*), parameter :: fmt_R = "(A, T11, G28.18E4)"
end module precision_M
--
Meilleures Salutations,
Kindest Regards,
/---
Jan van Oosterwijk
Computing Centre
Delft University of Technology
Postbus 354
2600 AJ Delft
Netherlands / Pays-Bas
mailto:[log in to unmask]
Phone: +31 15 27 85017
Fax: +31 15 27 83787
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|