This is related to #135
authorJulien Langou <julien.langou@ucdenver.edu>
Thu, 23 Mar 2017 19:43:42 +0000 (15:43 -0400)
committerJulien Langou <julien.langou@ucdenver.edu>
Thu, 23 Mar 2017 19:43:42 +0000 (15:43 -0400)
Since the order of multiplication in Fortran is left to right, the expression
      MAXITR*N*N*UNFL
first computes MAXITR*N*N as an INTEGER. This causes INTEGER overflow for
N>=18919.

To avoid the problem, rewrite as:
      MAXITR*(N*(N*UNFL))

SRC/dbdsqr.f
SRC/sbdsqr.f

index 0e46e71..d3630f3 100644 (file)
    40    CONTINUE
    50    CONTINUE
          SMINOA = SMINOA / SQRT( DBLE( N ) )
-         THRESH = MAX( TOL*SMINOA, MAXITR*N*N*UNFL )
+         THRESH = MAX( TOL*SMINOA, MAXITR*(N*(N*UNFL)) )
       ELSE
 *
 *        Absolute accuracy desired
 *
-         THRESH = MAX( ABS( TOL )*SMAX, MAXITR*N*N*UNFL )
+         THRESH = MAX( ABS( TOL )*SMAX, MAXITR*(N*(N*UNFL)) )
       END IF
 *
 *     Prepare for main iteration loop for the singular values
index 1456010..38fd1a0 100644 (file)
    40    CONTINUE
    50    CONTINUE
          SMINOA = SMINOA / SQRT( REAL( N ) )
-         THRESH = MAX( TOL*SMINOA, MAXITR*N*N*UNFL )
+         THRESH = MAX( TOL*SMINOA, MAXITR*(N*(N*UNFL)) )
       ELSE
 *
 *        Absolute accuracy desired
 *
-         THRESH = MAX( ABS( TOL )*SMAX, MAXITR*N*N*UNFL )
+         THRESH = MAX( ABS( TOL )*SMAX, MAXITR*(N*(N*UNFL)) )
       END IF
 *
 *     Prepare for main iteration loop for the singular values