[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