Skip to content

Commit

Permalink
Spend less time checking for NaN in xGEBAL
Browse files Browse the repository at this point in the history
  • Loading branch information
eprovst committed Mar 28, 2023
1 parent 21231d8 commit 9c489fd
Show file tree
Hide file tree
Showing 4 changed files with 32 additions and 40 deletions.
18 changes: 8 additions & 10 deletions SRC/cgebal.f
Original file line number Diff line number Diff line change
Expand Up @@ -353,23 +353,21 @@ SUBROUTINE CGEBAL( JOB, N, A, LDA, ILO, IHI, SCALE, INFO )
* Guard against zero C or R due to underflow.
*
IF( C.EQ.ZERO .OR. R.EQ.ZERO ) CYCLE
*
* Exit if NaN to avoid infinite loop
*
IF( SISNAN( C+CA+R+RA ) ) THEN
INFO = -3
CALL XERBLA( 'CGEBAL', -INFO )
RETURN
END IF
*
G = R / SCLFAC
F = ONE
S = C + R
*
DO WHILE( C.LT.G .AND. MAX( F, C, CA ).LT.SFMAX2 .AND.
$ MIN( R, G, RA ).GT.SFMIN2 )
*
IF( SISNAN( C+F+CA+R+G+RA ) ) THEN
*
* Exit if NaN to avoid infinite loop
*
INFO = -3
CALL XERBLA( 'CGEBAL', -INFO )
RETURN
END IF
*
F = F*SCLFAC
C = C*SCLFAC
CA = CA*SCLFAC
Expand Down
18 changes: 8 additions & 10 deletions SRC/dgebal.f
Original file line number Diff line number Diff line change
Expand Up @@ -348,23 +348,21 @@ SUBROUTINE DGEBAL( JOB, N, A, LDA, ILO, IHI, SCALE, INFO )
* Guard against zero C or R due to underflow.
*
IF( C.EQ.ZERO .OR. R.EQ.ZERO ) CYCLE
*
* Exit if NaN to avoid infinite loop
*
IF( DISNAN( C+CA+R+RA ) ) THEN
INFO = -3
CALL XERBLA( 'DGEBAL', -INFO )
RETURN
END IF
*
G = R / SCLFAC
F = ONE
S = C + R
*
DO WHILE( C.LT.G .AND. MAX( F, C, CA ).LT.SFMAX2 .AND.
$ MIN( R, G, RA ).GT.SFMIN2 )
*
IF( DISNAN( C+F+CA+R+G+RA ) ) THEN
*
* Exit if NaN to avoid infinite loop
*
INFO = -3
CALL XERBLA( 'DGEBAL', -INFO )
RETURN
END IF
*
F = F*SCLFAC
C = C*SCLFAC
CA = CA*SCLFAC
Expand Down
18 changes: 8 additions & 10 deletions SRC/sgebal.f
Original file line number Diff line number Diff line change
Expand Up @@ -348,23 +348,21 @@ SUBROUTINE SGEBAL( JOB, N, A, LDA, ILO, IHI, SCALE, INFO )
* Guard against zero C or R due to underflow.
*
IF( C.EQ.ZERO .OR. R.EQ.ZERO ) CYCLE
*
* Exit if NaN to avoid infinite loop
*
IF( SISNAN( C+CA+R+RA ) ) THEN
INFO = -3
CALL XERBLA( 'SGEBAL', -INFO )
RETURN
END IF
*
G = R / SCLFAC
F = ONE
S = C + R
*
DO WHILE( C.LT.G .AND. MAX( F, C, CA ).LT.SFMAX2 .AND.
$ MIN( R, G, RA ).GT.SFMIN2 )
*
IF( SISNAN( C+F+CA+R+G+RA ) ) THEN
*
* Exit if NaN to avoid infinite loop
*
INFO = -3
CALL XERBLA( 'SGEBAL', -INFO )
RETURN
END IF
*
F = F*SCLFAC
C = C*SCLFAC
CA = CA*SCLFAC
Expand Down
18 changes: 8 additions & 10 deletions SRC/zgebal.f
Original file line number Diff line number Diff line change
Expand Up @@ -353,23 +353,21 @@ SUBROUTINE ZGEBAL( JOB, N, A, LDA, ILO, IHI, SCALE, INFO )
* Guard against zero C or R due to underflow.
*
IF( C.EQ.ZERO .OR. R.EQ.ZERO ) CYCLE
*
* Exit if NaN to avoid infinite loop
*
IF( DISNAN( C+CA+R+RA ) ) THEN
INFO = -3
CALL XERBLA( 'ZGEBAL', -INFO )
RETURN
END IF
*
G = R / SCLFAC
F = ONE
S = C + R
*
DO WHILE( C.LT.G .AND. MAX( F, C, CA ).LT.SFMAX2 .AND.
$ MIN( R, G, RA ).GT.SFMIN2 )
*
IF( DISNAN( C+F+CA+R+G+RA ) ) THEN
*
* Exit if NaN to avoid infinite loop
*
INFO = -3
CALL XERBLA( 'ZGEBAL', -INFO )
RETURN
END IF
*
F = F*SCLFAC
C = C*SCLFAC
CA = CA*SCLFAC
Expand Down

0 comments on commit 9c489fd

Please sign in to comment.