Skip to content

Commit 073b96c

Browse files
xLARFGP: avoid overflows
Avoid overflows when XNORM << ABS(ALPHA) << 1.
1 parent 5b0bc5e commit 073b96c

File tree

4 files changed

+13
-9
lines changed

4 files changed

+13
-9
lines changed

SRC/clarfgp.f

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,7 @@ SUBROUTINE CLARFGP( N, ALPHA, X, INCX, TAU )
122122
* ..
123123
* .. Local Scalars ..
124124
INTEGER J, KNT
125-
REAL ALPHI, ALPHR, BETA, BIGNUM, SMLNUM, XNORM
125+
REAL ALPHI, ALPHR, BETA, BIGNUM, EPS, SMLNUM, XNORM
126126
COMPLEX SAVEALPHA
127127
* ..
128128
* .. External Functions ..
@@ -143,11 +143,12 @@ SUBROUTINE CLARFGP( N, ALPHA, X, INCX, TAU )
143143
RETURN
144144
END IF
145145
*
146+
EPS = SLAMCH( 'Precision' )
146147
XNORM = SCNRM2( N-1, X, INCX )
147148
ALPHR = REAL( ALPHA )
148149
ALPHI = AIMAG( ALPHA )
149150
*
150-
IF( XNORM.EQ.ZERO ) THEN
151+
IF( XNORM.LE.EPS*ABS(ALPHA) ) THEN
151152
*
152153
* H = [1-alpha/abs(alpha) 0; 0 I], sign chosen so ALPHA >= 0.
153154
*

SRC/dlarfgp.f

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,7 @@ SUBROUTINE DLARFGP( N, ALPHA, X, INCX, TAU )
122122
* ..
123123
* .. Local Scalars ..
124124
INTEGER J, KNT
125-
DOUBLE PRECISION BETA, BIGNUM, SAVEALPHA, SMLNUM, XNORM
125+
DOUBLE PRECISION BETA, BIGNUM, EPS, SAVEALPHA, SMLNUM, XNORM
126126
* ..
127127
* .. External Functions ..
128128
DOUBLE PRECISION DLAMCH, DLAPY2, DNRM2
@@ -141,11 +141,12 @@ SUBROUTINE DLARFGP( N, ALPHA, X, INCX, TAU )
141141
RETURN
142142
END IF
143143
*
144+
EPS = DLAMCH( 'Precision' )
144145
XNORM = DNRM2( N-1, X, INCX )
145146
*
146-
IF( XNORM.EQ.ZERO ) THEN
147+
IF( XNORM.LE.EPS*ABS(ALPHA) ) THEN
147148
*
148-
* H = [+/-1, 0; I], sign chosen so ALPHA >= 0
149+
* H = [+/-1, 0; I], sign chosen so ALPHA >= 0.
149150
*
150151
IF( ALPHA.GE.ZERO ) THEN
151152
* When TAU.eq.ZERO, the vector is special-cased to be

SRC/slarfgp.f

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,7 @@ SUBROUTINE SLARFGP( N, ALPHA, X, INCX, TAU )
122122
* ..
123123
* .. Local Scalars ..
124124
INTEGER J, KNT
125-
REAL BETA, BIGNUM, SAVEALPHA, SMLNUM, XNORM
125+
REAL BETA, BIGNUM, EPS, SAVEALPHA, SMLNUM, XNORM
126126
* ..
127127
* .. External Functions ..
128128
REAL SLAMCH, SLAPY2, SNRM2
@@ -141,9 +141,10 @@ SUBROUTINE SLARFGP( N, ALPHA, X, INCX, TAU )
141141
RETURN
142142
END IF
143143
*
144+
EPS = SLAMCH( 'Precision' )
144145
XNORM = SNRM2( N-1, X, INCX )
145146
*
146-
IF( XNORM.EQ.ZERO ) THEN
147+
IF( XNORM.LE.EPS*ABS(ALPHA) ) THEN
147148
*
148149
* H = [+/-1, 0; I], sign chosen so ALPHA >= 0.
149150
*

SRC/zlarfgp.f

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,7 @@ SUBROUTINE ZLARFGP( N, ALPHA, X, INCX, TAU )
122122
* ..
123123
* .. Local Scalars ..
124124
INTEGER J, KNT
125-
DOUBLE PRECISION ALPHI, ALPHR, BETA, BIGNUM, SMLNUM, XNORM
125+
DOUBLE PRECISION ALPHI, ALPHR, BETA, BIGNUM, EPS, SMLNUM, XNORM
126126
COMPLEX*16 SAVEALPHA
127127
* ..
128128
* .. External Functions ..
@@ -143,11 +143,12 @@ SUBROUTINE ZLARFGP( N, ALPHA, X, INCX, TAU )
143143
RETURN
144144
END IF
145145
*
146+
EPS = DLAMCH( 'Precision' )
146147
XNORM = DZNRM2( N-1, X, INCX )
147148
ALPHR = DBLE( ALPHA )
148149
ALPHI = DIMAG( ALPHA )
149150
*
150-
IF( XNORM.EQ.ZERO ) THEN
151+
IF( XNORM.LE.EPS*ABS(ALPHA) ) THEN
151152
*
152153
* H = [1-alpha/abs(alpha) 0; 0 I], sign chosen so ALPHA >= 0.
153154
*

0 commit comments

Comments
 (0)