Skip to content

Commit

Permalink
xLARFGP: avoid overflows
Browse files Browse the repository at this point in the history
Avoid overflows when XNORM << ABS(ALPHA) << 1.

fixes #934
  • Loading branch information
christoph-conrads committed Nov 10, 2023
1 parent 5b0bc5e commit 64897c4
Show file tree
Hide file tree
Showing 4 changed files with 13 additions and 9 deletions.
5 changes: 3 additions & 2 deletions SRC/clarfgp.f
Original file line number Diff line number Diff line change
Expand Up @@ -122,7 +122,7 @@ SUBROUTINE CLARFGP( N, ALPHA, X, INCX, TAU )
* ..
* .. Local Scalars ..
INTEGER J, KNT
REAL ALPHI, ALPHR, BETA, BIGNUM, SMLNUM, XNORM
REAL ALPHI, ALPHR, BETA, BIGNUM, EPS, SMLNUM, XNORM
COMPLEX SAVEALPHA
* ..
* .. External Functions ..
Expand All @@ -143,11 +143,12 @@ SUBROUTINE CLARFGP( N, ALPHA, X, INCX, TAU )
RETURN
END IF
*
EPS = SLAMCH( 'Precision' )
XNORM = SCNRM2( N-1, X, INCX )
ALPHR = REAL( ALPHA )
ALPHI = AIMAG( ALPHA )
*
IF( XNORM.EQ.ZERO ) THEN
IF( XNORM.LE.EPS*ABS(ALPHA) ) THEN
*
* H = [1-alpha/abs(alpha) 0; 0 I], sign chosen so ALPHA >= 0.
*
Expand Down
7 changes: 4 additions & 3 deletions SRC/dlarfgp.f
Original file line number Diff line number Diff line change
Expand Up @@ -122,7 +122,7 @@ SUBROUTINE DLARFGP( N, ALPHA, X, INCX, TAU )
* ..
* .. Local Scalars ..
INTEGER J, KNT
DOUBLE PRECISION BETA, BIGNUM, SAVEALPHA, SMLNUM, XNORM
DOUBLE PRECISION BETA, BIGNUM, EPS, SAVEALPHA, SMLNUM, XNORM
* ..
* .. External Functions ..
DOUBLE PRECISION DLAMCH, DLAPY2, DNRM2
Expand All @@ -141,11 +141,12 @@ SUBROUTINE DLARFGP( N, ALPHA, X, INCX, TAU )
RETURN
END IF
*
EPS = DLAMCH( 'Precision' )
XNORM = DNRM2( N-1, X, INCX )
*
IF( XNORM.EQ.ZERO ) THEN
IF( XNORM.LE.EPS*ABS(ALPHA) ) THEN
*
* H = [+/-1, 0; I], sign chosen so ALPHA >= 0
* H = [+/-1, 0; I], sign chosen so ALPHA >= 0.
*
IF( ALPHA.GE.ZERO ) THEN
* When TAU.eq.ZERO, the vector is special-cased to be
Expand Down
5 changes: 3 additions & 2 deletions SRC/slarfgp.f
Original file line number Diff line number Diff line change
Expand Up @@ -122,7 +122,7 @@ SUBROUTINE SLARFGP( N, ALPHA, X, INCX, TAU )
* ..
* .. Local Scalars ..
INTEGER J, KNT
REAL BETA, BIGNUM, SAVEALPHA, SMLNUM, XNORM
REAL BETA, BIGNUM, EPS, SAVEALPHA, SMLNUM, XNORM
* ..
* .. External Functions ..
REAL SLAMCH, SLAPY2, SNRM2
Expand All @@ -141,9 +141,10 @@ SUBROUTINE SLARFGP( N, ALPHA, X, INCX, TAU )
RETURN
END IF
*
EPS = SLAMCH( 'Precision' )
XNORM = SNRM2( N-1, X, INCX )
*
IF( XNORM.EQ.ZERO ) THEN
IF( XNORM.LE.EPS*ABS(ALPHA) ) THEN
*
* H = [+/-1, 0; I], sign chosen so ALPHA >= 0.
*
Expand Down
5 changes: 3 additions & 2 deletions SRC/zlarfgp.f
Original file line number Diff line number Diff line change
Expand Up @@ -122,7 +122,7 @@ SUBROUTINE ZLARFGP( N, ALPHA, X, INCX, TAU )
* ..
* .. Local Scalars ..
INTEGER J, KNT
DOUBLE PRECISION ALPHI, ALPHR, BETA, BIGNUM, SMLNUM, XNORM
DOUBLE PRECISION ALPHI, ALPHR, BETA, BIGNUM, EPS, SMLNUM, XNORM
COMPLEX*16 SAVEALPHA
* ..
* .. External Functions ..
Expand All @@ -143,11 +143,12 @@ SUBROUTINE ZLARFGP( N, ALPHA, X, INCX, TAU )
RETURN
END IF
*
EPS = DLAMCH( 'Precision' )
XNORM = DZNRM2( N-1, X, INCX )
ALPHR = DBLE( ALPHA )
ALPHI = DIMAG( ALPHA )
*
IF( XNORM.EQ.ZERO ) THEN
IF( XNORM.LE.EPS*ABS(ALPHA) ) THEN
*
* H = [1-alpha/abs(alpha) 0; 0 I], sign chosen so ALPHA >= 0.
*
Expand Down

0 comments on commit 64897c4

Please sign in to comment.