Rev 82211 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed
!> \brief \b LA_CONSTANTS is a module for the scaling constants for the compiled Fortran single and double precisions!! =========== DOCUMENTATION ===========!! Online html documentation available at! http://www.netlib.org/lapack/explore-html/!! Authors:! ========!!> \author Edward Anderson, Lockheed Martin!!> \date May 2016!!> \ingroup la_constants!!> \par Contributors:! ==================!>!> Weslley Pereira, University of Colorado Denver, USA!> Nick Papior, Technical University of Denmark, DK!!> \par Further Details:! =====================!>!> \verbatim!>!> Anderson E. (2017)!> Algorithm 978: Safe Scaling in the Level 1 BLAS!> ACM Trans Math Softw 44:1--28!> https://doi.org/10.1145/3061665!>!> Blue, James L. (1978)!> A Portable Fortran Program to Find the Euclidean Norm of a Vector!> ACM Trans Math Softw 4:15--23!> https://doi.org/10.1145/355769.355771!>!> \endverbatim!module LA_CONSTANTS! -- LAPACK auxiliary module --! -- LAPACK is a software package provided by Univ. of Tennessee, --! -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--! Standard constants forinteger, parameter :: sp = kind(1.e0)real(sp), parameter :: szero = 0.0_spreal(sp), parameter :: shalf = 0.5_spreal(sp), parameter :: sone = 1.0_spreal(sp), parameter :: stwo = 2.0_spreal(sp), parameter :: sthree = 3.0_spreal(sp), parameter :: sfour = 4.0_spreal(sp), parameter :: seight = 8.0_spreal(sp), parameter :: sten = 10.0_spcomplex(sp), parameter :: czero = ( 0.0_sp, 0.0_sp )complex(sp), parameter :: chalf = ( 0.5_sp, 0.0_sp )complex(sp), parameter :: cone = ( 1.0_sp, 0.0_sp )character*1, parameter :: sprefix = 'S'character*1, parameter :: cprefix = 'C'! Scaling constantsreal(sp), parameter :: sulp = epsilon(0._sp)real(sp), parameter :: seps = sulp * 0.5_spreal(sp), parameter :: ssafmin = real(radix(0._sp),sp)**max( &minexponent(0._sp)-1, &1-maxexponent(0._sp) &)real(sp), parameter :: ssafmax = sone / ssafminreal(sp), parameter :: ssmlnum = ssafmin / sulpreal(sp), parameter :: sbignum = ssafmax * sulpreal(sp), parameter :: srtmin = sqrt(ssmlnum)real(sp), parameter :: srtmax = sqrt(sbignum)! Blue's scaling constantsreal(sp), parameter :: stsml = real(radix(0._sp), sp)**ceiling( &(minexponent(0._sp) - 1) * 0.5_sp)real(sp), parameter :: stbig = real(radix(0._sp), sp)**floor( &(maxexponent(0._sp) - digits(0._sp) + 1) * 0.5_sp)! ssml >= 1/s, where s was defined in https://doi.org/10.1145/355769.355771! The correction was added in https://doi.org/10.1145/3061665 to scale denormalized numbers correctlyreal(sp), parameter :: sssml = real(radix(0._sp), sp)**( - floor( &(minexponent(0._sp) - digits(0._sp)) * 0.5_sp))! sbig = 1/S, where S was defined in https://doi.org/10.1145/355769.355771real(sp), parameter :: ssbig = real(radix(0._sp), sp)**( - ceiling( &(maxexponent(0._sp) + digits(0._sp) - 1) * 0.5_sp))! Standard constants forinteger, parameter :: dp = kind(1.d0)real(dp), parameter :: dzero = 0.0_dpreal(dp), parameter :: dhalf = 0.5_dpreal(dp), parameter :: done = 1.0_dpreal(dp), parameter :: dtwo = 2.0_dpreal(dp), parameter :: dthree = 3.0_dpreal(dp), parameter :: dfour = 4.0_dpreal(dp), parameter :: deight = 8.0_dpreal(dp), parameter :: dten = 10.0_dpcomplex(dp), parameter :: zzero = ( 0.0_dp, 0.0_dp )complex(dp), parameter :: zhalf = ( 0.5_dp, 0.0_dp )complex(dp), parameter :: zone = ( 1.0_dp, 0.0_dp )character*1, parameter :: dprefix = 'D'character*1, parameter :: zprefix = 'Z'! Scaling constantsreal(dp), parameter :: dulp = epsilon(0._dp)real(dp), parameter :: deps = dulp * 0.5_dpreal(dp), parameter :: dsafmin = real(radix(0._dp),dp)**max( &minexponent(0._dp)-1, &1-maxexponent(0._dp) &)real(dp), parameter :: dsafmax = done / dsafminreal(dp), parameter :: dsmlnum = dsafmin / dulpreal(dp), parameter :: dbignum = dsafmax * dulpreal(dp), parameter :: drtmin = sqrt(dsmlnum)real(dp), parameter :: drtmax = sqrt(dbignum)! Blue's scaling constantsreal(dp), parameter :: dtsml = real(radix(0._dp), dp)**ceiling( &(minexponent(0._dp) - 1) * 0.5_dp)real(dp), parameter :: dtbig = real(radix(0._dp), dp)**floor( &(maxexponent(0._dp) - digits(0._dp) + 1) * 0.5_dp)! ssml >= 1/s, where s was defined in https://doi.org/10.1145/355769.355771! The correction was added in https://doi.org/10.1145/3061665 to scale denormalized numbers correctlyreal(dp), parameter :: dssml = real(radix(0._dp), dp)**( - floor( &(minexponent(0._dp) - digits(0._dp)) * 0.5_dp))! sbig = 1/S, where S was defined in https://doi.org/10.1145/355769.355771real(dp), parameter :: dsbig = real(radix(0._dp), dp)**( - ceiling( &(maxexponent(0._dp) + digits(0._dp) - 1) * 0.5_dp))end module LA_CONSTANTS