Skip to content

Commit 9c489fd

Browse files
committed
Spend less time checking for NaN in xGEBAL
1 parent 21231d8 commit 9c489fd

File tree

4 files changed

+32
-40
lines changed

4 files changed

+32
-40
lines changed

SRC/cgebal.f

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -353,23 +353,21 @@ SUBROUTINE CGEBAL( JOB, N, A, LDA, ILO, IHI, SCALE, INFO )
353353
* Guard against zero C or R due to underflow.
354354
*
355355
IF( C.EQ.ZERO .OR. R.EQ.ZERO ) CYCLE
356+
*
357+
* Exit if NaN to avoid infinite loop
358+
*
359+
IF( SISNAN( C+CA+R+RA ) ) THEN
360+
INFO = -3
361+
CALL XERBLA( 'CGEBAL', -INFO )
362+
RETURN
363+
END IF
356364
*
357365
G = R / SCLFAC
358366
F = ONE
359367
S = C + R
360368
*
361369
DO WHILE( C.LT.G .AND. MAX( F, C, CA ).LT.SFMAX2 .AND.
362370
$ MIN( R, G, RA ).GT.SFMIN2 )
363-
*
364-
IF( SISNAN( C+F+CA+R+G+RA ) ) THEN
365-
*
366-
* Exit if NaN to avoid infinite loop
367-
*
368-
INFO = -3
369-
CALL XERBLA( 'CGEBAL', -INFO )
370-
RETURN
371-
END IF
372-
*
373371
F = F*SCLFAC
374372
C = C*SCLFAC
375373
CA = CA*SCLFAC

SRC/dgebal.f

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -348,23 +348,21 @@ SUBROUTINE DGEBAL( JOB, N, A, LDA, ILO, IHI, SCALE, INFO )
348348
* Guard against zero C or R due to underflow.
349349
*
350350
IF( C.EQ.ZERO .OR. R.EQ.ZERO ) CYCLE
351+
*
352+
* Exit if NaN to avoid infinite loop
353+
*
354+
IF( DISNAN( C+CA+R+RA ) ) THEN
355+
INFO = -3
356+
CALL XERBLA( 'DGEBAL', -INFO )
357+
RETURN
358+
END IF
351359
*
352360
G = R / SCLFAC
353361
F = ONE
354362
S = C + R
355363
*
356364
DO WHILE( C.LT.G .AND. MAX( F, C, CA ).LT.SFMAX2 .AND.
357365
$ MIN( R, G, RA ).GT.SFMIN2 )
358-
*
359-
IF( DISNAN( C+F+CA+R+G+RA ) ) THEN
360-
*
361-
* Exit if NaN to avoid infinite loop
362-
*
363-
INFO = -3
364-
CALL XERBLA( 'DGEBAL', -INFO )
365-
RETURN
366-
END IF
367-
*
368366
F = F*SCLFAC
369367
C = C*SCLFAC
370368
CA = CA*SCLFAC

SRC/sgebal.f

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -348,23 +348,21 @@ SUBROUTINE SGEBAL( JOB, N, A, LDA, ILO, IHI, SCALE, INFO )
348348
* Guard against zero C or R due to underflow.
349349
*
350350
IF( C.EQ.ZERO .OR. R.EQ.ZERO ) CYCLE
351+
*
352+
* Exit if NaN to avoid infinite loop
353+
*
354+
IF( SISNAN( C+CA+R+RA ) ) THEN
355+
INFO = -3
356+
CALL XERBLA( 'SGEBAL', -INFO )
357+
RETURN
358+
END IF
351359
*
352360
G = R / SCLFAC
353361
F = ONE
354362
S = C + R
355363
*
356364
DO WHILE( C.LT.G .AND. MAX( F, C, CA ).LT.SFMAX2 .AND.
357365
$ MIN( R, G, RA ).GT.SFMIN2 )
358-
*
359-
IF( SISNAN( C+F+CA+R+G+RA ) ) THEN
360-
*
361-
* Exit if NaN to avoid infinite loop
362-
*
363-
INFO = -3
364-
CALL XERBLA( 'SGEBAL', -INFO )
365-
RETURN
366-
END IF
367-
*
368366
F = F*SCLFAC
369367
C = C*SCLFAC
370368
CA = CA*SCLFAC

SRC/zgebal.f

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -353,23 +353,21 @@ SUBROUTINE ZGEBAL( JOB, N, A, LDA, ILO, IHI, SCALE, INFO )
353353
* Guard against zero C or R due to underflow.
354354
*
355355
IF( C.EQ.ZERO .OR. R.EQ.ZERO ) CYCLE
356+
*
357+
* Exit if NaN to avoid infinite loop
358+
*
359+
IF( DISNAN( C+CA+R+RA ) ) THEN
360+
INFO = -3
361+
CALL XERBLA( 'ZGEBAL', -INFO )
362+
RETURN
363+
END IF
356364
*
357365
G = R / SCLFAC
358366
F = ONE
359367
S = C + R
360368
*
361369
DO WHILE( C.LT.G .AND. MAX( F, C, CA ).LT.SFMAX2 .AND.
362370
$ MIN( R, G, RA ).GT.SFMIN2 )
363-
*
364-
IF( DISNAN( C+F+CA+R+G+RA ) ) THEN
365-
*
366-
* Exit if NaN to avoid infinite loop
367-
*
368-
INFO = -3
369-
CALL XERBLA( 'ZGEBAL', -INFO )
370-
RETURN
371-
END IF
372-
*
373371
F = F*SCLFAC
374372
C = C*SCLFAC
375373
CA = CA*SCLFAC

0 commit comments

Comments
 (0)