[clang] [C++23] [CLANG] Adding C++23 constexpr math functions: fmin and frexp. (PR #88978)

Hubert Tong via cfe-commits cfe-commits at lists.llvm.org
Wed May 1 18:34:08 PDT 2024


================
@@ -0,0 +1,57 @@
+// RUN: %clang_cc1 -DWIN -verify -std=c++23 -fsyntax-only  %s
+// RUN: %clang_cc1 -verify -std=c++23 -fsyntax-only  %s
+
+// expected-no-diagnostics
+
+
+#ifdef WIN
+#define INFINITY ((float)(1e+300 * 1e+300))
+#define NAN      (-(float)(INFINITY * 0.0F))
+#else
+#define NAN (__builtin_nanf(""))
+#define INFINITY (__builtin_inff())
+#endif
+
+extern "C" void abort() noexcept;
+extern "C" int write(int, const void*, unsigned long);
+
+#define assert(condition) \
+  do {			    \
+    if (!(condition)) {					\
+      write(2, "Assertion failed: ", 18);		\
+      write(2, #condition, sizeof(#condition) - 1);	\
+      write(2, "\n", 1);				\
+      abort();						\
+    }							\
+  } while (false)
+
+int main() {
+    int i;
+
+    // fmin
+    static_assert(__builtin_fmin(15.24, 1.3) == 1.3, "");
+    static_assert(__builtin_fmin(-0.0, +0.0) == -0.0, "");
+    static_assert(__builtin_fmin(+0.0, -0.0) == -0.0, "");
+    assert(__builtin_isnan(__builtin_fminf(NAN,NAN)));
+    assert(__builtin_isnan(__builtin_fminf(NAN, -1)));
+    assert(__builtin_isnan(__builtin_fminf(-INFINITY, 0)));
+    assert(__builtin_iszero(__builtin_fminf(+INFINITY, 0)));
+
+    // frexp
+    static_assert(__builtin_frexp(123.45, &i) == 0.96445312500000002);
----------------
hubert-reinterpretcast wrote:

@zahiraam, make `simulateFrexp` a `constexpr` function (maybe with `float` and `long double` overloads as well).

```
template <typename T>
struct FrexpResult {
  constexpr FrexpResult(T fraction, int exponent) : fraction(fraction), exponent(exponent) {}
  T fraction;
  int exponent;
  friend constexpr bool operator<=>(const FrexpResult &, const FrexpResult &) = default;
};

constexpr auto q() { return FrexpResult{0.5, 0}; };
static_assert(q() == FrexpResult{0.5, 0});
```

https://github.com/llvm/llvm-project/pull/88978


More information about the cfe-commits mailing list