Skip to content

Commit b7a2e4b

Browse files
author
jason
committed
Fix ZLARFP and CLARFP optimizations when the vector is zero.
The x == zero branch ignored complex alphas. The code still functioned, but it scaled the entire zero vector. Now that I think of it, I should scan upwards for the scaling, too. That will be a separate enhancement patch; this is just the bug fix. This patch also fixes an accidental precision shortening in ZLARFP, which used CMPLX in the dead branch. Reported by Igor Zhuravlov on the LAPACK web goo thingy, currently at http://icl.cs.utk.edu/lapack-forum/viewtopic.php?t=924 Also lead to finding a related (but different) error in the LAWN and (accepted, still in editing) SISC paper. Signed-off-by: Jason Riedy <[email protected]>
1 parent 10b4e11 commit b7a2e4b

File tree

2 files changed

+7
-7
lines changed

2 files changed

+7
-7
lines changed

SRC/clarfp.f

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ SUBROUTINE CLARFP( N, ALPHA, X, INCX, TAU )
8888
ALPHR = REAL( ALPHA )
8989
ALPHI = AIMAG( ALPHA )
9090
*
91-
IF( XNORM.EQ.ZERO .AND. ALPHI.EQ.ZERO ) THEN
91+
IF( XNORM.EQ.ZERO ) THEN
9292
*
9393
* H = [1-alpha/abs(alpha) 0; 0 I], sign chosen so ALPHA >= 0.
9494
*
@@ -103,7 +103,7 @@ SUBROUTINE CLARFP( N, ALPHA, X, INCX, TAU )
103103
! zero checks when TAU.ne.ZERO, and we must clear X.
104104
TAU = TWO
105105
DO J = 1, N-1
106-
X( 1 + (J-1)*INCX ) = 0
106+
X( 1 + (J-1)*INCX ) = ZERO
107107
END DO
108108
ALPHA = -ALPHA
109109
END IF
@@ -112,7 +112,7 @@ SUBROUTINE CLARFP( N, ALPHA, X, INCX, TAU )
112112
XNORM = SLAPY2( ALPHR, ALPHI )
113113
TAU = CMPLX( ONE - ALPHR / XNORM, -ALPHI / XNORM )
114114
DO J = 1, N-1
115-
X( 1 + (J-1)*INCX ) = 0
115+
X( 1 + (J-1)*INCX ) = ZERO
116116
END DO
117117
ALPHA = XNORM
118118
END IF

SRC/zlarfp.f

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ SUBROUTINE ZLARFP( N, ALPHA, X, INCX, TAU )
8888
ALPHR = DBLE( ALPHA )
8989
ALPHI = DIMAG( ALPHA )
9090
*
91-
IF( XNORM.EQ.ZERO .AND. ALPHI.EQ.ZERO ) THEN
91+
IF( XNORM.EQ.ZERO ) THEN
9292
*
9393
* H = [1-alpha/abs(alpha) 0; 0 I], sign chosen so ALPHA >= 0.
9494
*
@@ -103,16 +103,16 @@ SUBROUTINE ZLARFP( N, ALPHA, X, INCX, TAU )
103103
! zero checks when TAU.ne.ZERO, and we must clear X.
104104
TAU = TWO
105105
DO J = 1, N-1
106-
X( 1 + (J-1)*INCX ) = 0
106+
X( 1 + (J-1)*INCX ) = ZERO
107107
END DO
108108
ALPHA = -ALPHA
109109
END IF
110110
ELSE
111111
! Only "reflecting" the diagonal entry to be real and non-negative.
112112
XNORM = DLAPY2( ALPHR, ALPHI )
113-
TAU = CMPLX( ONE - ALPHR / XNORM, -ALPHI / XNORM )
113+
TAU = DCMPLX( ONE - ALPHR / XNORM, -ALPHI / XNORM )
114114
DO J = 1, N-1
115-
X( 1 + (J-1)*INCX ) = 0
115+
X( 1 + (J-1)*INCX ) = ZERO
116116
END DO
117117
ALPHA = XNORM
118118
END IF

0 commit comments

Comments
 (0)