After three irrelevant commit ( r706, r707, r708), this is the first relevant
authorlangou <langou@users.noreply.github.com>
Mon, 21 Dec 2009 21:11:58 +0000 (21:11 +0000)
committerlangou <langou@users.noreply.github.com>
Mon, 21 Dec 2009 21:11:58 +0000 (21:11 +0000)
modifications. I believe that in the complex case, when NORMX = ZERO but ALPHI
is not ZERO (i.e. ALPHA has a complex imaginary part), then TAU needs to be
such that:

            " ( 1 - TAU ) * ( ALPHA ) = ABS( ALPHA ) "

Since we have
            ALPHR = REAL( ALPHA )
            ALPHI = AIMAG( ALPHA )
            XNORM = DLAPY2( ALPHR, ALPHI )
The way to do this is to set TAU with

            TAU = CMPLX( ONE - ALPHR / XNORM, ALPHI / XNORM )

as opposed to

            TAU = CMPLX( ONE - ALPHR / XNORM, -ALPHI / XNORM )

(Note: XNORM is used as temporary variable here)

SRC/clarfp.f
SRC/zlarfp.f

index 22435db..7eb21ee 100644 (file)
          ELSE
 *           Only "reflecting" the diagonal entry to be real and non-negative.
             XNORM = SLAPY2( ALPHR, ALPHI )
-            TAU = CMPLX( ONE - ALPHR / XNORM, -ALPHI / XNORM )
+            TAU = CMPLX( ONE - ALPHR / XNORM, ALPHI / XNORM )
             DO J = 1, N-1
                X( 1 + (J-1)*INCX ) = ZERO
             END DO
index ac4e9d4..b34083b 100644 (file)
          ELSE
 *           Only "reflecting" the diagonal entry to be real and non-negative.
             XNORM = DLAPY2( ALPHR, ALPHI )
-            TAU = DCMPLX( ONE - ALPHR / XNORM, -ALPHI / XNORM )
+            TAU = DCMPLX( ONE - ALPHR / XNORM, ALPHI / XNORM )
             DO J = 1, N-1
                X( 1 + (J-1)*INCX ) = ZERO
             END DO