[flang-commits] [PATCH] D151272: [flang] Fix SPACING() of very small values

Peter Klausler via Phabricator via flang-commits flang-commits at lists.llvm.org
Wed May 24 08:04:55 PDT 2023


This revision was automatically updated to reflect the committed changes.
Closed by commit rGd71297ce7468: [flang] Fix SPACING() of very small values (authored by klausler).

Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D151272/new/

https://reviews.llvm.org/D151272

Files:
  flang/lib/Evaluate/real.cpp
  flang/runtime/numeric.cpp
  flang/test/Evaluate/fold-spacing.f90


Index: flang/test/Evaluate/fold-spacing.f90
===================================================================
--- flang/test/Evaluate/fold-spacing.f90
+++ flang/test/Evaluate/fold-spacing.f90
@@ -7,6 +7,7 @@
   logical, parameter :: test_4 = spacing(0.) == tiny(0.)
   logical, parameter :: test_5 = spacing(tiny(0.)) == 1.e-45
   logical, parameter :: test_6 = spacing(8388608.) == 1.
+  logical, parameter :: test_7 = spacing(spacing(tiny(.0))) == tiny(0.)
   logical, parameter :: test_11 = rrspacing(3.0) == scale(0.75, 24)
   logical, parameter :: test_12 = rrspacing(-3.0) == scale(0.75, 24)
   logical, parameter :: test_13 = rrspacing(3.0d0) == scale(0.75, 53)
Index: flang/runtime/numeric.cpp
===================================================================
--- flang/runtime/numeric.cpp
+++ flang/runtime/numeric.cpp
@@ -239,8 +239,9 @@
     // subnormal.
     return std::numeric_limits<T>::min(); // 0 -> TINY(x)
   } else {
-    return std::ldexp(
-        static_cast<T>(1.0), std::ilogb(x) + 1 - PREC); // 2**(e-p)
+    T result{
+        std::ldexp(static_cast<T>(1.0), std::ilogb(x) + 1 - PREC)}; // 2**(e-p)
+    return result == 0 ? /*TINY(x)*/ std::numeric_limits<T>::min() : result;
   }
 }
 
Index: flang/lib/Evaluate/real.cpp
===================================================================
--- flang/lib/Evaluate/real.cpp
+++ flang/lib/Evaluate/real.cpp
@@ -745,12 +745,12 @@
     return *this;
   } else if (IsInfinite()) {
     return NotANumber();
-  } else if (IsZero()) {
-    return TINY();
+  } else if (IsZero() || IsSubnormal()) {
+    return TINY(); // mandated by standard
   } else {
     Real result;
     result.Normalize(false, Exponent(), Fraction::MASKR(1));
-    return result;
+    return result.IsZero() ? TINY() : result;
   }
 }
 


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D151272.525188.patch
Type: text/x-patch
Size: 1785 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/flang-commits/attachments/20230524/c00b8d8e/attachment-0001.bin>


More information about the flang-commits mailing list