Skip to content

Commit f878424

Browse files
authored
fix calculation of non-exceptional shift (from Reference-LAPACK PR 477)
1 parent 3dbb32c commit f878424

File tree

2 files changed

+34
-20
lines changed

2 files changed

+34
-20
lines changed

lapack-netlib/SRC/chgeqz.f

Lines changed: 17 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -320,12 +320,13 @@ SUBROUTINE CHGEQZ( JOB, COMPQ, COMPZ, N, ILO, IHI, H, LDH, T, LDT,
320320
$ C, SAFMIN, TEMP, TEMP2, TEMPR, ULP
321321
COMPLEX ABI22, AD11, AD12, AD21, AD22, CTEMP, CTEMP2,
322322
$ CTEMP3, ESHIFT, RTDISC, S, SHIFT, SIGNBC, T1,
323-
$ U12, X
323+
$ U12, X, ABI12, Y
324324
* ..
325325
* .. External Functions ..
326+
COMPLEX CLADIV
326327
LOGICAL LSAME
327328
REAL CLANHS, SLAMCH
328-
EXTERNAL LSAME, CLANHS, SLAMCH
329+
EXTERNAL CLADIV, LLSAME, CLANHS, SLAMCH
329330
* ..
330331
* .. External Subroutines ..
331332
EXTERNAL CLARTG, CLASET, CROT, CSCAL, XERBLA
@@ -729,15 +730,21 @@ SUBROUTINE CHGEQZ( JOB, COMPQ, COMPZ, N, ILO, IHI, H, LDH, T, LDT,
729730
AD22 = ( ASCALE*H( ILAST, ILAST ) ) /
730731
$ ( BSCALE*T( ILAST, ILAST ) )
731732
ABI22 = AD22 - U12*AD21
733+
ABI12 = AD12 - U12*AD11
732734
*
733-
T1 = HALF*( AD11+ABI22 )
734-
RTDISC = SQRT( T1**2+AD12*AD21-AD11*AD22 )
735-
TEMP = REAL( T1-ABI22 )*REAL( RTDISC ) +
736-
$ AIMAG( T1-ABI22 )*AIMAG( RTDISC )
737-
IF( TEMP.LE.ZERO ) THEN
738-
SHIFT = T1 + RTDISC
739-
ELSE
740-
SHIFT = T1 - RTDISC
735+
SHIFT = ABI22
736+
CTEMP = SQRT( ABI12 )*SQRT( AD21 )
737+
TEMP = ABS1( CTEMP )
738+
IF( CTEMP.NE.ZERO ) THEN
739+
X = HALF*( AD11-SHIFT )
740+
TEMP2 = ABS1( X )
741+
TEMP = MAX( TEMP, ABS1( X ) )
742+
Y = TEMP*SQRT( ( X / TEMP )**2+( CTEMP / TEMP )**2 )
743+
IF( TEMP2.GT.ZERO ) THEN
744+
IF( DBLE( X / TEMP2 )*DBLE( Y )+
745+
$ DIMAG( X / TEMP2 )*DIMAG( Y ).LT.ZERO )Y = -Y
746+
END IF
747+
SHIFT = SHIFT - CTEMP*CLADIV( CTEMP, ( X+Y ) )
741748
END IF
742749
ELSE
743750
*

lapack-netlib/SRC/zhgeqz.f

Lines changed: 17 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -320,12 +320,13 @@ SUBROUTINE ZHGEQZ( JOB, COMPQ, COMPZ, N, ILO, IHI, H, LDH, T, LDT,
320320
$ C, SAFMIN, TEMP, TEMP2, TEMPR, ULP
321321
COMPLEX*16 ABI22, AD11, AD12, AD21, AD22, CTEMP, CTEMP2,
322322
$ CTEMP3, ESHIFT, RTDISC, S, SHIFT, SIGNBC, T1,
323-
$ U12, X
323+
$ U12, X, ABI12, Y
324324
* ..
325325
* .. External Functions ..
326+
COMPLEX*16 ZLADIV
326327
LOGICAL LSAME
327328
DOUBLE PRECISION DLAMCH, ZLANHS
328-
EXTERNAL LSAME, DLAMCH, ZLANHS
329+
EXTERNAL ZLADIV, LSAME, DLAMCH, ZLANHS
329330
* ..
330331
* .. External Subroutines ..
331332
EXTERNAL XERBLA, ZLARTG, ZLASET, ZROT, ZSCAL
@@ -730,15 +731,21 @@ SUBROUTINE ZHGEQZ( JOB, COMPQ, COMPZ, N, ILO, IHI, H, LDH, T, LDT,
730731
AD22 = ( ASCALE*H( ILAST, ILAST ) ) /
731732
$ ( BSCALE*T( ILAST, ILAST ) )
732733
ABI22 = AD22 - U12*AD21
734+
ABI12 = AD12 - U12*AD11
733735
*
734-
T1 = HALF*( AD11+ABI22 )
735-
RTDISC = SQRT( T1**2+AD12*AD21-AD11*AD22 )
736-
TEMP = DBLE( T1-ABI22 )*DBLE( RTDISC ) +
737-
$ DIMAG( T1-ABI22 )*DIMAG( RTDISC )
738-
IF( TEMP.LE.ZERO ) THEN
739-
SHIFT = T1 + RTDISC
740-
ELSE
741-
SHIFT = T1 - RTDISC
736+
SHIFT = ABI22
737+
CTEMP = SQRT( ABI12 )*SQRT( AD21 )
738+
TEMP = ABS1( CTEMP )
739+
IF( CTEMP.NE.ZERO ) THEN
740+
X = HALF*( AD11-SHIFT )
741+
TEMP2 = ABS1( X )
742+
TEMP = MAX( TEMP, ABS1( X ) )
743+
Y = TEMP*SQRT( ( X / TEMP )**2+( CTEMP / TEMP )**2 )
744+
IF( TEMP2.GT.ZERO ) THEN
745+
IF( DBLE( X / TEMP2 )*DBLE( Y )+
746+
$ DIMAG( X / TEMP2 )*DIMAG( Y ).LT.ZERO )Y = -Y
747+
END IF
748+
SHIFT = SHIFT - CTEMP*ZLADIV( CTEMP, ( X+Y ) )
742749
END IF
743750
ELSE
744751
*

0 commit comments

Comments
 (0)