@@ -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