From 81d28e7b13617eba42ef44062442a0500ba121bb Mon Sep 17 00:00:00 2001 From: Simon Maertens Date: Wed, 22 Jul 2026 16:40:10 +0200 Subject: [PATCH] Avoid computing ONE / HUGE(ZERO) unless it is needed. Some compilers (e.g., flang) warn about underflow when folding the expression. --- INSTALL/dlamch.f | 9 +++++---- INSTALL/slamch.f | 9 +++++---- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/INSTALL/dlamch.f b/INSTALL/dlamch.f index e151db4a2..8719e42fa 100644 --- a/INSTALL/dlamch.f +++ b/INSTALL/dlamch.f @@ -83,7 +83,7 @@ PARAMETER ( ONE = 1.0D+0, ZERO = 0.0D+0 ) * .. * .. Local Scalars .. - DOUBLE PRECISION RND, EPS, SFMIN, SMALL, RMACH + DOUBLE PRECISION RND, EPS, SFMIN, SMALL, HUGEVAL, RMACH * .. * .. External Functions .. LOGICAL LSAME @@ -110,8 +110,9 @@ RMACH = EPS ELSE IF( LSAME( CMACH, 'S' ) ) THEN SFMIN = TINY(ZERO) - SMALL = ONE / HUGE(ZERO) - IF( SMALL.GE.SFMIN ) THEN + HUGEVAL = HUGE(ZERO) + IF( HUGEVAL*SFMIN.LE.ONE ) THEN + SMALL = ONE / HUGEVAL * * Use SMALL plus a bit, to avoid the possibility of rounding * causing overflow when computing 1/sfmin. @@ -130,7 +131,7 @@ ELSE IF( LSAME( CMACH, 'M' ) ) THEN RMACH = MINEXPONENT(ZERO) ELSE IF( LSAME( CMACH, 'U' ) ) THEN - RMACH = tiny(zero) + RMACH = TINY(ZERO) ELSE IF( LSAME( CMACH, 'L' ) ) THEN RMACH = MAXEXPONENT(ZERO) ELSE IF( LSAME( CMACH, 'O' ) ) THEN diff --git a/INSTALL/slamch.f b/INSTALL/slamch.f index 1fd9f1533..5f7ffbeb5 100644 --- a/INSTALL/slamch.f +++ b/INSTALL/slamch.f @@ -82,7 +82,7 @@ PARAMETER ( ONE = 1.0E+0, ZERO = 0.0E+0 ) * .. * .. Local Scalars .. - REAL RND, EPS, SFMIN, SMALL, RMACH + REAL RND, EPS, SFMIN, SMALL, HUGEVAL, RMACH * .. * .. External Functions .. LOGICAL LSAME @@ -109,8 +109,9 @@ RMACH = EPS ELSE IF( LSAME( CMACH, 'S' ) ) THEN SFMIN = TINY(ZERO) - SMALL = ONE / HUGE(ZERO) - IF( SMALL.GE.SFMIN ) THEN + HUGEVAL = HUGE(ZERO) + IF( HUGEVAL*SFMIN.LE.ONE ) THEN + SMALL = ONE / HUGEVAL * * Use SMALL plus a bit, to avoid the possibility of rounding * causing overflow when computing 1/sfmin. @@ -129,7 +130,7 @@ ELSE IF( LSAME( CMACH, 'M' ) ) THEN RMACH = MINEXPONENT(ZERO) ELSE IF( LSAME( CMACH, 'U' ) ) THEN - RMACH = tiny(zero) + RMACH = TINY(ZERO) ELSE IF( LSAME( CMACH, 'L' ) ) THEN RMACH = MAXEXPONENT(ZERO) ELSE IF( LSAME( CMACH, 'O' ) ) THEN