@@ -264,8 +264,8 @@ SUBROUTINE DLATRS( UPLO, TRANS, DIAG, NORMIN, N, A, LDA, X, SCALE,
264264* .. External Functions ..
265265 LOGICAL LSAME
266266 INTEGER IDAMAX
267- DOUBLE PRECISION DASUM, DDOT, DLAMCH
268- EXTERNAL LSAME, IDAMAX, DASUM, DDOT, DLAMCH
267+ DOUBLE PRECISION DASUM, DDOT, DLAMCH, DLANGE
268+ EXTERNAL LSAME, IDAMAX, DASUM, DDOT, DLAMCH, DLANGE
269269* ..
270270* .. External Subroutines ..
271271 EXTERNAL DAXPY, DSCAL, DTRSV, XERBLA
@@ -343,8 +343,67 @@ SUBROUTINE DLATRS( UPLO, TRANS, DIAG, NORMIN, N, A, LDA, X, SCALE,
343343 IF ( TMAX.LE. BIGNUM ) THEN
344344 TSCAL = ONE
345345 ELSE
346- TSCAL = ONE / ( SMLNUM* TMAX )
347- CALL DSCAL( N, TSCAL, CNORM, 1 )
346+ *
347+ * Avoid NaN generation if entries in CNORM exceed the
348+ * overflow threshold
349+ *
350+ IF ( TMAX.LE. DLAMCH(' Overflow' ) ) THEN
351+ * Case 1: All entries in CNORM are valid floating-point numbers
352+ TSCAL = ONE / ( SMLNUM* TMAX )
353+ CALL DSCAL( N, TSCAL, CNORM, 1 )
354+ ELSE
355+ * Case 2: At least one column norm of A cannot be represented
356+ * as floating-point number. Find the offdiagonal entry A( I, J )
357+ * with the largest absolute value. If this entry is not +/- Infinity,
358+ * use this value as TSCAL.
359+ TMAX = ZERO
360+ IF ( UPPER ) THEN
361+ *
362+ * A is upper triangular.
363+ *
364+ DO J = 2 , N
365+ TMAX = MAX ( DLANGE( ' M' , J-1 , 1 , A( 1 , J ), 1 , SUMJ ),
366+ $ TMAX )
367+ END DO
368+ ELSE
369+ *
370+ * A is lower triangular.
371+ *
372+ DO J = 1 , N - 1
373+ TMAX = MAX ( DLANGE( ' M' , N- J, 1 , A( J+1 , J ), 1 ,
374+ $ SUMJ ), TMAX )
375+ END DO
376+ END IF
377+ *
378+ IF ( TMAX.LE. DLAMCH(' Overflow' ) ) THEN
379+ TSCAL = ONE / ( SMLNUM* TMAX )
380+ DO J = 1 , N
381+ IF ( CNORM( J ).LE. DLAMCH(' Overflow' ) ) THEN
382+ CNORM( J ) = CNORM( J )* TSCAL
383+ ELSE
384+ * Recompute the 1-norm without introducing Infinity
385+ * in the summation
386+ CNORM( J ) = ZERO
387+ IF ( UPPER ) THEN
388+ DO I = 1 , J - 1
389+ CNORM( J ) = CNORM( J ) +
390+ $ TSCAL * ABS ( A( I, J ) )
391+ END DO
392+ ELSE
393+ DO I = J + 1 , N
394+ CNORM( J ) = CNORM( J ) +
395+ $ TSCAL * ABS ( A( I, J ) )
396+ END DO
397+ END IF
398+ END IF
399+ END DO
400+ ELSE
401+ * At least one entry of A is not a valid floating-point entry.
402+ * Rely on TRSV to propagate Inf and NaN.
403+ CALL DTRSV( UPLO, TRANS, DIAG, N, A, LDA, X, 1 )
404+ RETURN
405+ END IF
406+ END IF
348407 END IF
349408*
350409* Compute a bound on the computed solution vector to see if the
0 commit comments