[libc-commits] [libc] [libc][math][c23] add c23 floating point fmaximum and fminimum functions. (PR #86016)
via libc-commits
libc-commits at lists.llvm.org
Mon Mar 25 10:24:50 PDT 2024
================
@@ -58,6 +59,126 @@ LIBC_INLINE T fmax(T x, T y) {
}
}
+template <typename T, cpp::enable_if_t<cpp::is_floating_point_v<T>, int> = 0>
+LIBC_INLINE T fmaximum(T x, T y) {
+ FPBits<T> bitx(x), bity(y);
+
+ if (bitx.is_nan())
+ return x;
+ if (bity.is_nan())
+ return y;
+ if (bitx.sign() != bity.sign())
+ return (bitx.is_neg() ? y : x);
+ return x > y ? x : y;
+}
+
+template <typename T, cpp::enable_if_t<cpp::is_floating_point_v<T>, int> = 0>
+LIBC_INLINE T fminimum(T x, T y) {
+ const FPBits<T> bitx(x), bity(y);
+
+ if (bitx.is_nan())
+ return x;
+ if (bity.is_nan())
+ return y;
+ if (bitx.sign() != bity.sign())
+ return (bitx.is_neg()) ? x : y;
+ return x < y ? x : y;
+}
+
+template <typename T, cpp::enable_if_t<cpp::is_floating_point_v<T>, int> = 0>
+LIBC_INLINE T fmaximum_num(T x, T y) {
+ FPBits<T> bitx(x), bity(y);
+
+ if (bitx.is_signaling_nan()) {
+ fputil::raise_except_if_required(FE_INVALID);
+ if (bity.is_nan())
+ return FPBits<T>::quiet_nan().get_val();
+ return y;
+ }
+ if (bity.is_signaling_nan()) {
+ fputil::raise_except_if_required(FE_INVALID);
+ if (bitx.is_nan())
+ return FPBits<T>::quiet_nan().get_val();
+ return x;
+ }
+ if (bitx.is_quiet_nan())
+ return y;
+ if (bity.is_quiet_nan())
+ return x;
----------------
lntue wrote:
Sorry the logic I posted above is not correct for `fmaximum_num(aNaN, sNaN)`. The corrected version is:
```
if (bitx.is_signaling_nan() || bity.is_signaling_nan()) {
fputil::raise_except_if_required(FE_INVALID);
if (bitx.is_nan() && bity.is_nan())
return FPBits<T>::quiet_nan().get_val();
}
if (bitx.is_nan())
return y;
if (bity.is_nan())
return x;
if (bitx.sign() != bity.sign())
return (bitx.is_neg() ? y : x);
return x > y ? x : y;
```
`fminimum_num` can be updated similarly.
https://github.com/llvm/llvm-project/pull/86016
More information about the libc-commits
mailing list