diff --git a/flang/runtime/numeric.cpp b/flang/runtime/numeric.cpp --- a/flang/runtime/numeric.cpp +++ b/flang/runtime/numeric.cpp @@ -109,7 +109,7 @@ } else if (x == 0) { return 0; // 0 -> 0 } else { - int expo{std::ilogb(x)}; + int expo{std::ilogb(x) + 1}; auto ip{static_cast(p - expo)}; if (ip != p - expo) { ip = p < 0 ? std::numeric_limits::min() diff --git a/flang/unittests/Runtime/Numeric.cpp b/flang/unittests/Runtime/Numeric.cpp --- a/flang/unittests/Runtime/Numeric.cpp +++ b/flang/unittests/Runtime/Numeric.cpp @@ -142,10 +142,10 @@ TEST(Numeric, SetExponent) { EXPECT_EQ(RTNAME(SetExponent4)(Real<4>{0}, 0), 0); EXPECT_EQ(RTNAME(SetExponent8)(Real<8>{0}, 666), 0); - EXPECT_EQ(RTNAME(SetExponent8)(Real<8>{3.0}, 0), 1.5); - EXPECT_EQ(RTNAME(SetExponent4)(Real<4>{1.0}, 0), 1.0); - EXPECT_EQ(RTNAME(SetExponent4)(Real<4>{1.0}, 1), 2.0); - EXPECT_EQ(RTNAME(SetExponent4)(Real<4>{1.0}, -1), 0.5); + EXPECT_EQ(RTNAME(SetExponent8)(Real<8>{3.0}, 0), 0.75); + EXPECT_EQ(RTNAME(SetExponent4)(Real<4>{1.0}, 0), 0.5); + EXPECT_EQ(RTNAME(SetExponent4)(Real<4>{1.0}, 1), 1.0); + EXPECT_EQ(RTNAME(SetExponent4)(Real<4>{1.0}, -1), 0.25); EXPECT_TRUE(std::isnan( RTNAME(SetExponent4)(std::numeric_limits>::infinity(), 1))); EXPECT_TRUE(std::isnan(