diff --git a/flang/include/flang/Evaluate/real.h b/flang/include/flang/Evaluate/real.h --- a/flang/include/flang/Evaluate/real.h +++ b/flang/include/flang/Evaluate/real.h @@ -125,8 +125,10 @@ template constexpr INT EXPONENT() const { if (Exponent() == maxExponent) { return INT::HUGE(); + } else if (IsZero()) { + return {0}; } else { - return {UnbiasedExponent()}; + return {UnbiasedExponent() + 1}; } } @@ -308,6 +310,8 @@ // Extracts unbiased exponent value. // Corrects the exponent value of a subnormal number. + // Note that the result is one less than the EXPONENT intrinsic; + // UnbiasedExponent(1.0) is 0, not 1. constexpr int UnbiasedExponent() const { int exponent{Exponent() - exponentBias}; if (IsSubnormal()) { diff --git a/flang/test/Evaluate/folding07.f90 b/flang/test/Evaluate/folding07.f90 --- a/flang/test/Evaluate/folding07.f90 +++ b/flang/test/Evaluate/folding07.f90 @@ -197,6 +197,14 @@ logical, parameter :: test_tiny10 = tiny10 == ztiny10 logical, parameter :: test_tiny16 = tiny16 == ztiny16 + logical, parameter :: test_exponent_0 = exponent(0.0) == 0 + logical, parameter :: test_exponent_r8 = exponent(0.125) == -2 + logical, parameter :: test_exponent_r4 = exponent(0.25) == -1 + logical, parameter :: test_exponent_r2 = exponent(0.5) == 0 + logical, parameter :: test_exponent_1 = exponent(1.0) == 1 + logical, parameter :: test_exponent_4 = exponent(4.1) == 3 + logical, parameter :: test_exponent_12 = exponent(12.9) == 4 + integer, parameter :: & max2 = maxexponent(0._2), & max3 = maxexponent(0._3), &