1: !> \brief \b LA_CONSTANTS is a module for the scaling constants for the compiled Fortran single and double precisions
2: !
3: ! =========== DOCUMENTATION ===========
4: !
5: ! Online html documentation available at
6: ! http://www.netlib.org/lapack/explore-html/
7: !
8: ! Authors:
9: ! ========
10: !
11: !> \author Edward Anderson, Lockheed Martin
12: !
13: !> \date May 2016
14: !
15: !> \ingroup OTHERauxiliary
16: !
17: !> \par Contributors:
18: ! ==================
19: !>
20: !> Weslley Pereira, University of Colorado Denver, USA
21: !> Nick Papior, Technical University of Denmark, DK
22: !
23: !> \par Further Details:
24: ! =====================
25: !>
26: !> \verbatim
27: !>
28: !> Anderson E. (2017)
29: !> Algorithm 978: Safe Scaling in the Level 1 BLAS
30: !> ACM Trans Math Softw 44:1--28
31: !> https://doi.org/10.1145/3061665
32: !>
33: !> Blue, James L. (1978)
34: !> A Portable Fortran Program to Find the Euclidean Norm of a Vector
35: !> ACM Trans Math Softw 4:15--23
36: !> https://doi.org/10.1145/355769.355771
37: !>
38: !> \endverbatim
39: !
40: module LA_CONSTANTS
41: ! -- LAPACK auxiliary module --
42: ! -- LAPACK is a software package provided by Univ. of Tennessee, --
43: ! -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
44:
45: ! Standard constants for
46: integer, parameter :: sp = kind(1.e0)
47:
48: real(sp), parameter :: szero = 0.0_sp
49: real(sp), parameter :: shalf = 0.5_sp
50: real(sp), parameter :: sone = 1.0_sp
51: real(sp), parameter :: stwo = 2.0_sp
52: real(sp), parameter :: sthree = 3.0_sp
53: real(sp), parameter :: sfour = 4.0_sp
54: real(sp), parameter :: seight = 8.0_sp
55: real(sp), parameter :: sten = 10.0_sp
56: complex(sp), parameter :: czero = ( 0.0_sp, 0.0_sp )
57: complex(sp), parameter :: chalf = ( 0.5_sp, 0.0_sp )
58: complex(sp), parameter :: cone = ( 1.0_sp, 0.0_sp )
59: character*1, parameter :: sprefix = 'S'
60: character*1, parameter :: cprefix = 'C'
61:
62: ! Scaling constants
63: real(sp), parameter :: sulp = epsilon(0._sp)
64: real(sp), parameter :: seps = sulp * 0.5_sp
65: real(sp), parameter :: ssafmin = real(radix(0._sp),sp)**max( &
66: minexponent(0._sp)-1, &
67: 1-maxexponent(0._sp) &
68: )
69: real(sp), parameter :: ssafmax = sone / ssafmin
70: real(sp), parameter :: ssmlnum = ssafmin / sulp
71: real(sp), parameter :: sbignum = ssafmax * sulp
72: real(sp), parameter :: srtmin = sqrt(ssmlnum)
73: real(sp), parameter :: srtmax = sqrt(sbignum)
74:
75: ! Blue's scaling constants
76: real(sp), parameter :: stsml = real(radix(0._sp), sp)**ceiling( &
77: (minexponent(0._sp) - 1) * 0.5_sp)
78: real(sp), parameter :: stbig = real(radix(0._sp), sp)**floor( &
79: (maxexponent(0._sp) - digits(0._sp) + 1) * 0.5_sp)
80: ! ssml >= 1/s, where s was defined in https://doi.org/10.1145/355769.355771
81: ! The correction was added in https://doi.org/10.1145/3061665 to scale denormalized numbers correctly
82: real(sp), parameter :: sssml = real(radix(0._sp), sp)**( - floor( &
83: (minexponent(0._sp) - digits(0._sp)) * 0.5_sp))
84: ! sbig = 1/S, where S was defined in https://doi.org/10.1145/355769.355771
85: real(sp), parameter :: ssbig = real(radix(0._sp), sp)**( - ceiling( &
86: (maxexponent(0._sp) + digits(0._sp) - 1) * 0.5_sp))
87:
88: ! Standard constants for
89: integer, parameter :: dp = kind(1.d0)
90:
91: real(dp), parameter :: dzero = 0.0_dp
92: real(dp), parameter :: dhalf = 0.5_dp
93: real(dp), parameter :: done = 1.0_dp
94: real(dp), parameter :: dtwo = 2.0_dp
95: real(dp), parameter :: dthree = 3.0_dp
96: real(dp), parameter :: dfour = 4.0_dp
97: real(dp), parameter :: deight = 8.0_dp
98: real(dp), parameter :: dten = 10.0_dp
99: complex(dp), parameter :: zzero = ( 0.0_dp, 0.0_dp )
100: complex(dp), parameter :: zhalf = ( 0.5_dp, 0.0_dp )
101: complex(dp), parameter :: zone = ( 1.0_dp, 0.0_dp )
102: character*1, parameter :: dprefix = 'D'
103: character*1, parameter :: zprefix = 'Z'
104:
105: ! Scaling constants
106: real(dp), parameter :: dulp = epsilon(0._dp)
107: real(dp), parameter :: deps = dulp * 0.5_dp
108: real(dp), parameter :: dsafmin = real(radix(0._dp),dp)**max( &
109: minexponent(0._dp)-1, &
110: 1-maxexponent(0._dp) &
111: )
112: real(dp), parameter :: dsafmax = done / dsafmin
113: real(dp), parameter :: dsmlnum = dsafmin / dulp
114: real(dp), parameter :: dbignum = dsafmax * dulp
115: real(dp), parameter :: drtmin = sqrt(dsmlnum)
116: real(dp), parameter :: drtmax = sqrt(dbignum)
117:
118: ! Blue's scaling constants
119: real(dp), parameter :: dtsml = real(radix(0._dp), dp)**ceiling( &
120: (minexponent(0._dp) - 1) * 0.5_dp)
121: real(dp), parameter :: dtbig = real(radix(0._dp), dp)**floor( &
122: (maxexponent(0._dp) - digits(0._dp) + 1) * 0.5_dp)
123: ! ssml >= 1/s, where s was defined in https://doi.org/10.1145/355769.355771
124: ! The correction was added in https://doi.org/10.1145/3061665 to scale denormalized numbers correctly
125: real(dp), parameter :: dssml = real(radix(0._dp), dp)**( - floor( &
126: (minexponent(0._dp) - digits(0._dp)) * 0.5_dp))
127: ! sbig = 1/S, where S was defined in https://doi.org/10.1145/355769.355771
128: real(dp), parameter :: dsbig = real(radix(0._dp), dp)**( - ceiling( &
129: (maxexponent(0._dp) + digits(0._dp) - 1) * 0.5_dp))
130:
131: end module LA_CONSTANTS
CVSweb interface <joel.bertrand@systella.fr>