Skip to content

Commit b6df159

Browse files
authored
Avoid computing ONE/HUGE unless needed (Reference-LAPACK PR 1331)
1 parent 8c1535b commit b6df159

2 files changed

Lines changed: 10 additions & 8 deletions

File tree

lapack-netlib/INSTALL/dlamch.f

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ DOUBLE PRECISION FUNCTION DLAMCH( CMACH )
8484
PARAMETER ( ONE = 1.0D+0, ZERO = 0.0D+0 )
8585
* ..
8686
* .. Local Scalars ..
87-
DOUBLE PRECISION RND, EPS, SFMIN, SMALL, RMACH
87+
DOUBLE PRECISION RND, EPS, SFMIN, SMALL, HUGEVAL, RMACH
8888
* ..
8989
* .. External Functions ..
9090
LOGICAL LSAME
@@ -111,8 +111,9 @@ DOUBLE PRECISION FUNCTION DLAMCH( CMACH )
111111
RMACH = EPS
112112
ELSE IF( LSAME( CMACH, 'S' ) ) THEN
113113
SFMIN = TINY(ZERO)
114-
SMALL = ONE / HUGE(ZERO)
115-
IF( SMALL.GE.SFMIN ) THEN
114+
HUGEVAL = HUGE(ZERO)
115+
IF( HUGEVAL*SFMIN.LE.ONE ) THEN
116+
SMALL = ONE / HUGEVAL
116117
*
117118
* Use SMALL plus a bit, to avoid the possibility of rounding
118119
* causing overflow when computing 1/sfmin.
@@ -131,7 +132,7 @@ DOUBLE PRECISION FUNCTION DLAMCH( CMACH )
131132
ELSE IF( LSAME( CMACH, 'M' ) ) THEN
132133
RMACH = MINEXPONENT(ZERO)
133134
ELSE IF( LSAME( CMACH, 'U' ) ) THEN
134-
RMACH = tiny(zero)
135+
RMACH = TINY(ZERO)
135136
ELSE IF( LSAME( CMACH, 'L' ) ) THEN
136137
RMACH = MAXEXPONENT(ZERO)
137138
ELSE IF( LSAME( CMACH, 'O' ) ) THEN

lapack-netlib/INSTALL/slamch.f

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ REAL FUNCTION SLAMCH( CMACH )
8484
PARAMETER ( ONE = 1.0E+0, ZERO = 0.0E+0 )
8585
* ..
8686
* .. Local Scalars ..
87-
REAL RND, EPS, SFMIN, SMALL, RMACH
87+
REAL RND, EPS, SFMIN, SMALL, HUGEVAL, RMACH
8888
* ..
8989
* .. External Functions ..
9090
LOGICAL LSAME
@@ -111,8 +111,9 @@ REAL FUNCTION SLAMCH( CMACH )
111111
RMACH = EPS
112112
ELSE IF( LSAME( CMACH, 'S' ) ) THEN
113113
SFMIN = TINY(ZERO)
114-
SMALL = ONE / HUGE(ZERO)
115-
IF( SMALL.GE.SFMIN ) THEN
114+
HUGEVAL = HUGE(ZERO)
115+
IF( HUGEVAL*SFMIN.LE.ONE ) THEN
116+
SMALL = ONE / HUGEVAL
116117
*
117118
* Use SMALL plus a bit, to avoid the possibility of rounding
118119
* causing overflow when computing 1/sfmin.
@@ -131,7 +132,7 @@ REAL FUNCTION SLAMCH( CMACH )
131132
ELSE IF( LSAME( CMACH, 'M' ) ) THEN
132133
RMACH = MINEXPONENT(ZERO)
133134
ELSE IF( LSAME( CMACH, 'U' ) ) THEN
134-
RMACH = tiny(zero)
135+
RMACH = TINY(ZERO)
135136
ELSE IF( LSAME( CMACH, 'L' ) ) THEN
136137
RMACH = MAXEXPONENT(ZERO)
137138
ELSE IF( LSAME( CMACH, 'O' ) ) THEN

0 commit comments

Comments
 (0)